我对指令中经常看到的 $scope.$eval
感到好奇,因此我检查了源代码并在 rootScope.js
中找到了以下内容:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
似乎是由 parse.js
中的 ParseProvider
定义的,它似乎定义了自己的某种迷你语法(该文件有 900 行长)。
我的问题是:
$eval
到底在做什么?为什么它需要自己的迷你解析语言?为什么不使用普通的旧式 JavaScript
eval
?
最佳答案
$eval
和 $parse
不评估 JavaScript;他们评估 AngularJS expressions 。链接的文档解释了表达式和 JavaScript 之间的差异。
问:$eval 到底在做什么?为什么它需要自己的迷你解析语言?
来自文档:
Expressions are JavaScript-like code snippets that are usually placed in bindings such as {{ expression }}. Expressions are processed by $parse service.
它是一种类似于 JavaScript 的迷你语言,它限制了您可以运行的内容(例如,没有控制流语句,三元运算符除外),并添加了一些 AngularJS 的优点(例如过滤器)。
问:为什么不使用普通的旧式 javascript“eval”?
因为它实际上并没有评估 JavaScript。正如文档所说:
If ... you do want to run arbitrary JavaScript code, you should make it a controller method and call the method. If you want to eval() an angular expression from JavaScript, use the $eval() method.
上面链接的文档包含更多信息。
关于angularjs - Angular.js : How does $eval work and why is it different from vanilla eval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15671471/