Byłem ciekawy tego, $scope.$eval
co tak często widzisz w dyrektywach, więc sprawdziłem źródło i znalazłem w rootScope.js
:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
wydaje się być zdefiniowany przez program ParseProvider
in parse.js
, który wydaje się definiować jakąś własną mini-składnię (plik ma długość 900 linii).
Moje pytania to:
Co dokładnie
$eval
robi? Dlaczego potrzebuje własnego mini języka parsowania?Dlaczego nie
eval
jest używany zwykły stary JavaScript ?
$parse
jest niesamowicie świetny.Odpowiedzi:
$eval
i$parse
nie oceniaj JavaScript; oceniają wyrażenia AngularJS . Dołączona dokumentacja wyjaśnia różnice między wyrażeniami a JavaScript.P: Co dokładnie robi $ eval? Dlaczego potrzebuje własnego mini języka parsowania?
Z dokumentów:
Jest to mini-język podobny do JavaScript, który ogranicza to, co możesz uruchomić (np. Nie ma instrukcji przepływu sterowania, z wyjątkiem operatora trójskładnikowego), a także dodaje trochę dobroci AngularJS (np. Filtry).
P: Dlaczego nie jest używany zwykły stary javascript „eval”?
Ponieważ tak naprawdę nie ocenia JavaScript. Jak mówią doktorzy:
Dokumenty, do których linki znajdują się powyżej, zawierają dużo więcej informacji.
źródło
$eval
nie ocenia JavaScript; ocenia wyrażenia AngularJS, które są trochę bezpieczniejszym podzbiorem JavaScript."{id: 'val'}"
jest prawidłowym wyrażeniem AngularJS i powinien zwrócić prawidłowy obiekt JS. Zobacz link powyżej, aby zobaczyć różnicę między wyrażeniami a zwykłym JS.Z testu
Do wyrażenia oceny możemy również przekazać lokalne wartości.
źródło
Myślę, że na jedno z pierwotnych pytań tutaj nie udzielono odpowiedzi. Uważam, że vanilla eval () nie jest używana, ponieważ wtedy aplikacje kątowe nie działałyby jako aplikacje Chrome, co wyraźnie uniemożliwia użycie eval () ze względów bezpieczeństwa.
źródło