Angular.js: Wie funktioniert $ eval und warum unterscheidet es sich von vanilla eval?

Ich war neugierig auf den $scope.$eval du so oft in Direktiven siehst, also habe ich die Quelle rootScope.js und Folgendes in rootScope.js :

  $eval: function(expr, locals) { return $parse(expr)(this, locals); }, 

$parse scheint von ParseProvider in parse.js definiert zu sein, was scheinbar eine Art Mini-Syntax definiert (die Datei ist 900 Zeilen lang).

Meine Fragen sind:

  1. Was genau macht $eval ? Warum benötigt es eine eigene Mini-Parsing-Sprache?

  2. Warum wird nicht einfach altes JavaScript eval verwendet?

   

$eval und $parse werten JavaScript nicht aus; Sie werten AngularJS- Ausdrücke aus . Die verknüpfte Dokumentation erläutert die Unterschiede zwischen Ausdrücken und JavaScript.

F: Was genau macht $ eval? Warum benötigt es eine eigene Mini-Parsing-Sprache?

Aus den Dokumenten:

Ausdrücke sind JavaScript-ähnliche Code-Snippets, die normalerweise in Bindungen wie {{Ausdruck}} platziert werden. Ausdrücke werden vom $ parse-Dienst verarbeitet.

Es ist eine JavaScript-ähnliche Minisprache, die das, was Sie ausführen können, einschränkt (z. B. keine Steuerflussanweisungen, mit Ausnahme des ternären Operators) und einige AngularJS-Güte (z. B. Filter) hinzufügt.

F: Warum wird nicht einfach altes Javascript “eval” verwendet?

Weil es JavaScript nicht wirklich bewertet. Wie die Ärzte sagen:

Wenn Sie … beliebigen JavaScript-Code ausführen möchten, sollten Sie eine Controller-Methode erstellen und die Methode aufrufen. Wenn Sie einen eckigen Ausdruck aus JavaScript eval () verwenden möchten, verwenden Sie die $ eval () -Methode.

Die Dokumente, die mit oben verlinkt sind, haben viel mehr Informationen.

Aus dem Test,

 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); })); 

Wir können auch Ortsansässige für einen Bewertungsausdruck übergeben.

Ich denke, dass eine der ursprünglichen Fragen hier nicht beantwortet wurde. Ich glaube, dass vanilla eval () nicht verwendet wird, weil eckige Apps dann nicht als Chrome-Apps funktionieren würden, was eval () aus Sicherheitsgründen ausdrücklich verbietet.