为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2019-12-20 10:37:47
我很好奇$scope.$eval您经常在指令中看到您,因此我检查了源代码并在中找到以下内容rootScope.js:  $eval: function(expr, locals) {    return $parse(expr)(this, locals);  },$parse似乎由ParseProviderin 定义,in parse.js似乎定义了自己的某种微型语法(文件长900行)。我的问题是:到底在$eval做什么?为什么需要自己的小型解析语言?为什么不使用普通的旧JavaScript eval?
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

$eval而且$parse不要评估JavaScript;他们评估AngularJS 表达式。链接的文档解释了表达式和JavaScript之间的区别。


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


从文档:


表达式是类似于JavaScript的代码段,通常放置在诸如{{expression}}之类的绑定中。表达式由$ parse服务处理。


这是一种类似于JavaScript的迷你语言,它限制了您可以运行的内容(例如,除了三元运算符之外,没有控制流语句),并且增加了一些AngularJS的优点(例如,过滤器)。


问:为什么不使用普通的旧javascript“ eval”?


因为它实际上不是在评估JavaScript。正如文档所说:


如果您确实想运行任意JavaScript代码,则应将其设为控制器方法并调用该方法。如果要从JavaScript评估角度表达式,请使用$ eval()方法。


上面链接的文档有更多信息。


查看完整回答
反对 回复 2019-12-20
?
MYYA

TA贡献1868条经验 获得超4个赞

从测试来看


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

}));

我们还可以通过本地人进行评估表达。


查看完整回答
反对 回复 2019-12-20
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 850 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信