angularjs - and - Angular.js: ¿Cómo funciona $ eval y por qué es diferente de vanilla eval?
or en angularjs (3)
Creo que una de las preguntas originales aquí no fue respondida. Creo que vanilla eval () no se usa porque las aplicaciones angulosas no funcionarían como aplicaciones de Chrome, lo que evita explícitamente la utilización de eval () por razones de seguridad.
Tenía curiosidad acerca del $scope.$eval
que ve tan a menudo en las directivas, así que revisé la fuente y encontré lo siguiente en rootScope.js
:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
parece estar definido por ParseProvider
en parse.js
, que parece definir algún tipo de mini sintaxis propia (el archivo tiene 900 líneas de longitud).
Mis preguntas son:
¿Qué está haciendo exactamente
$eval
? ¿Por qué necesita su propio mini lenguaje de análisis?¿Por qué no se usa la simple
eval
JavaScript antigua?
De la prueba,
it(''should allow passing locals to the expression'', inject(function($rootScope) {
expect($rootScope.$eval(''a+1'', {a: 2})).toBe(3);
$rootScope.$eval(function(scope, locals) {
scope.c = locals.b + 4;
}, {b: 3});
expect($rootScope.c).toBe(7);
}));
También podemos pasar a los locales para la expresión de evaluación.
$eval
y $parse
no evalúan JavaScript; ellos evalúan expressions AngularJS. La documentación vinculada explica las diferencias entre expresiones y JavaScript.
P: ¿Qué está haciendo exactamente $ eval? ¿Por qué necesita su propio mini lenguaje de análisis?
De los documentos:
Las expresiones son fragmentos de código tipo JavaScript que generalmente se colocan en enlaces como {{expression}}. Las expresiones son procesadas por el servicio $ parse.
Es un minilenguaje similar a JavaScript que limita lo que se puede ejecutar (por ejemplo, sin instrucciones de flujo de control, excepto el operador ternario) y agrega algo de bondad AngularJS (por ejemplo, filtros).
P: ¿Por qué no se usa el antiguo javascript "eval"?
Porque en realidad no está evaluando JavaScript. Como dicen los doctores:
Si ... desea ejecutar código JavaScript arbitrario, debe convertirlo en un método de controlador y llamar al método. Si desea evaluar () una expresión angular de JavaScript, use el método $ eval ().
Los documentos vinculados anteriormente tienen mucha más información.