J'étais curieux de savoir ce que $scope.$eval
vous voyez si souvent dans les directives, alors j'ai vérifié la source et trouvé ce qui suit dans rootScope.js
:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
semble être défini par ParseProvider
in parse.js
, qui semble définir une sorte de mini-syntaxe qui lui est propre (le fichier fait 900 lignes).
Mes questions sont:
Que fait exactement
$eval
? Pourquoi a-t-il besoin de son propre mini-langage d'analyse?Pourquoi le vieux JavaScript n'est-il pas
eval
utilisé?
$parse
est incroyablement génial.Réponses:
$eval
et$parse
n'évaluez pas JavaScript; ils évaluent les expressions AngularJS . La documentation liée explique les différences entre les expressions et JavaScript.Q: Que fait exactement $ eval? Pourquoi a-t-il besoin de son propre mini-langage d'analyse?
À partir de la documentation:
C'est un mini-langage de type JavaScript qui limite ce que vous pouvez exécuter (par exemple, aucune instruction de flux de contrôle, à l'exception de l'opérateur ternaire) et ajoute des avantages AngularJS (par exemple des filtres).
Q: Pourquoi le vieux javascript "eval" n'est-il pas utilisé?
Parce qu'il n'évalue pas réellement JavaScript. Comme le disent les documents:
Les documents liés à ci-dessus contiennent beaucoup plus d'informations.
la source
$eval
n'évalue pas JavaScript; il évalue les expressions AngularJS, qui sont un peu comme un sous-ensemble plus sûr de JavaScript."{id: 'val'}"
est une expression AngularJS valide et doit renvoyer un objet JS valide. Voir le lien ci-dessus pour la différence entre les expressions et le JS régulier.Du test,
Nous pouvons également passer des sections locales pour l'expression d'évaluation.
la source
Je pense qu'une des questions originales ici n'a pas été répondue. Je crois que vanilla eval () n'est pas utilisé car les applications angulaires ne fonctionneraient pas comme des applications Chrome, ce qui empêche explicitement eval () d'être utilisé pour des raisons de sécurité.
la source