Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Angular.js:$eval是如何工作的,为什么它不同于香草eval?_Angularjs - Fatal编程技术网

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

Angularjs Angular.js:$eval是如何工作的,为什么它不同于香草eval?,angularjs,Angularjs,我对指令中经常出现的$scope.$eval感到好奇,所以我查看了源代码,在rootScope.js中找到了以下内容: $eval: function(expr, locals) { return $parse(expr)(this, locals); }, $parse似乎是由parse.js中的ParseProvider定义的,它似乎定义了自己的某种小型语法(文件有900行长) 我的问题是: $eval到底在做什么?为什么它需要自己的迷你解析语言 为什么不使用普通的Java

我对指令中经常出现的
$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。链接文档解释了表达式和JavaScript之间的差异

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

    从文档中:

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

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

    Q:为什么不使用普通的老javascript“eval”?

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

    如果。。。如果要运行任意JavaScript代码,则应将其设置为控制器方法并调用该方法。如果要从JavaScript中计算角度表达式,请使用$eval()方法

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

    从测试中

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

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

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

    $eval在当前作用域上计算角度表达式。顺便说一句,$parse非常棒。你说$eval没有实际计算JavaScript,但如果我计算$eval(“{id:'val'}”)我得到一个JS对象。(Angular 1.0.8)@Yappli
    $eval
    不计算JavaScript;它计算AngularJS表达式,这有点像JavaScript的一个更安全的子集。{code>”{id:'val'}“是有效的AngularJS表达式,应返回有效的JS对象。请参阅上面的链接,了解表达式和常规JS之间的区别。答案不错,但我不确定“例如,没有控制流语句”是否准确。你可以这样做。。。ng click=“someVal?someFunc(someVal):noop”这是一个完全有效的角度expression@CharlieMartin文档中明确指出,但您的观点是正确的。然而,我绝对不建议在ngClick中这样做;这种逻辑几乎肯定属于控制器。有趣的是,文档中说,由于有意添加了对三元运算符的支持。。。ng click只是一个简单的例子,我同意逻辑应该在控制器中,但我不认为在括号符号中使用三元运算符有任何错误,angular团队显然也没有,或者他们不会增加对它的支持。我想如果要进行更正,那么应该在回答之前在文档中进行更正