首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Angular.js:$eval是如何工作的,为什么它不同于vanilla eval?

Angular.js:$eval是如何工作的,为什么它不同于vanilla eval?
EN

Stack Overflow用户
提问于 2013-03-28 07:24:52
回答 3查看 126.2K关注 0票数 153

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

代码语言:javascript
复制
  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },

$parse似乎是由ParseProviderparse.js中定义的,它似乎定义了自己的某种小型语法(该文件有900行长)。

我的问题是:

  1. $eval到底在做什么?为什么它需要自己的迷你解析语言?
  2. 为什么不使用普通的老式JavaScript eval
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-28 07:36:10

$eval$parse不评估JavaScript;他们评估AngularJS expressions。链接的文档解释了expressions和JavaScript之间的区别。

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

从文档中:

表达式是类似JavaScript的代码片段,通常放在{{

}}这样的绑定中。表达式由$parse服务处理。

它是一种类似JavaScript的迷你语言,它限制了你可以运行的东西(例如,没有控制流语句,除了三元运算符),还增加了一些AngularJS的优点(例如,过滤器)。

Q:为什么不使用普通的旧式javascript "eval“?

因为它实际上并没有计算JavaScript。就像医生说的:

If ...如果你想运行任意的JavaScript代码,你应该让它成为一个控制器方法并调用这个方法。如果要对JavaScript中的角度表达式求值(),请使用$eval()方法。

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

票数 187
EN

Stack Overflow用户

发布于 2013-12-16 23:45:02

从测试中看,

代码语言:javascript
复制
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);
}));

我们还可以传递求值表达式的局部变量。

票数 22
EN

Stack Overflow用户

发布于 2015-08-27 06:53:01

我认为这里的一个原始问题没有得到回答。我认为没有使用vanilla eval(),因为那样angular应用程序就不会像Chrome应用程序那样工作,因为Chrome应用程序明确禁止出于安全原因使用eval()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15671471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档