Мне было любопытно, что $scope.$eval
вы так часто видите в директивах, поэтому я проверил источник и нашел следующее в rootScope.js
:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
по-видимому, определяется с помощью ParseProvider
in parse.js
, который, по-видимому, определяет некоторый собственный мини-синтаксис (длина файла составляет 900 строк).
Мои вопросы:
Что именно
$eval
делает? Зачем ему нужен собственный мини-язык синтаксического анализа?Почему не используется старый старый JavaScript
eval
?
$parse
, безумно здорово.Ответы:
$eval
и$parse
не оценивайте JavaScript; они оценивают выражения AngularJS . Связанная документация объясняет различия между выражениями и JavaScript.Q: Что именно делает $ eval? Зачем ему нужен собственный мини-язык синтаксического анализа?
Из документов:
Это JavaScript-подобный мини-язык, который ограничивает то, что вы можете запускать (например, нет операторов потока управления, исключая троичный оператор), а также добавляет некоторые преимущества AngularJS (например, фильтры).
В: Почему не используется простой старый javascript «eval»?
Потому что это на самом деле не оценка JavaScript. Как говорят в документах:
Документы, ссылки на которые приведены выше, содержат гораздо больше информации.
источник
$eval
не оценивает JavaScript; он оценивает выражения AngularJS, которые вроде как более безопасное подмножество JavaScript."{id: 'val'}"
является допустимым выражением AngularJS и должно возвращать действительный объект JS. См. Ссылку выше для различия между выражениями и обычным JS.Из теста,
Мы также можем передать локальные выражения для выражения оценки.
источник
Я думаю, что один из оригинальных вопросов здесь не был дан ответ. Я считаю, что vanilla eval () не используется, потому что тогда угловые приложения не будут работать как приложения Chrome, которые явно не позволяют использовать eval () по соображениям безопасности.
источник