Tenía curiosidad sobre el $scope.$eval
que a menudo ves 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
in parse.js
, que parece definir algún tipo de mini-sintaxis propia (el archivo tiene 900 líneas de largo).
Mis preguntas son:
Que es exactamente
$eval
haciendo ? ¿Por qué necesita su propio lenguaje de análisis mini?¿Por qué no
eval
se usa JavaScript antiguo ?
$parse
es increíblemente genial.Respuestas:
$eval
y$parse
no evalúes JavaScript; evalúan expresiones AngularJS . La documentación vinculada explica las diferencias entre expresiones y JavaScript.P: ¿Qué está haciendo exactamente $ eval? ¿Por qué necesita su propio lenguaje de análisis mini?
De los documentos:
Es un minilenguaje similar a JavaScript que limita lo que puede ejecutar (por ejemplo, sin sentencias de flujo de control, excepto el operador ternario), así como agrega algo de bondad AngularJS (por ejemplo, filtros).
P: ¿Por qué no se usa javascript "eval"?
Porque en realidad no está evaluando JavaScript. Como dicen los documentos:
Los documentos vinculados a arriba tienen mucha más información.
fuente
$eval
no evalúa JavaScript; evalúa expresiones AngularJS, que son como un subconjunto más seguro de JavaScript."{id: 'val'}"
es una expresión AngularJS válida y debe devolver un objeto JS válido. Vea el enlace de arriba para ver la diferencia entre expresiones y JS regular.De la prueba,
También podemos pasar locales para la expresión de evaluación.
fuente
Creo que una de las preguntas originales aquí no fue respondida. Creo que vanilla eval () no se usa porque las aplicaciones angulares no funcionarían como aplicaciones de Chrome, lo que impide explícitamente que eval () se use por razones de seguridad.
fuente