猿问

Angular.js:$ eval如何工作,为什么与香草eval不同?

我很好奇$scope.$eval您经常在指令中看到您,因此我检查了源代码并在中找到以下内容rootScope.js:


  $eval: function(expr, locals) {

    return $parse(expr)(this, locals);

  },

$parse似乎由ParseProviderin 定义,in parse.js似乎定义了自己的某种微型语法(文件长900行)。


我的问题是:


到底在$eval做什么?为什么需要自己的小型解析语言?


为什么不使用普通的旧JavaScript eval?


德玛西亚99
浏览 879回答 3
3回答

莫回无

$eval而且$parse不要评估JavaScript;他们评估AngularJS 表达式。链接的文档解释了表达式和JavaScript之间的区别。问:$ eval到底在做什么?为什么需要自己的小型解析语言?从文档:表达式是类似于JavaScript的代码段,通常放置在诸如{{expression}}之类的绑定中。表达式由$ parse服务处理。这是一种类似于JavaScript的迷你语言,它限制了您可以运行的内容(例如,除了三元运算符之外,没有控制流语句),并且增加了一些AngularJS的优点(例如,过滤器)。问:为什么不使用普通的旧javascript“ eval”?因为它实际上不是在评估JavaScript。正如文档所说:如果您确实想运行任意JavaScript代码,则应将其设为控制器方法并调用该方法。如果要从JavaScript评估角度表达式,请使用$ eval()方法。上面链接的文档有更多信息。

MYYA

从测试来看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);}));我们还可以通过本地人进行评估表达。

繁华开满天机

我认为这里没有回答原始问题之一。我认为不使用香草eval(),因为角度应用程序将无法像Chrome应用程序一样工作,这出于安全原因明显阻止了eval()的使用。
随时随地看视频慕课网APP

相关分类

AngularJS
我要回答