在ECMAScript 5.1中获取Value()

时间:2014-05-02 13:13:36

标签: javascript

我正在检查this article,在此行(1,eval)(‘1+1’)

中说明了这一点
  

"逗号运算符(在(1,eval)示例中)对其执行GetValue   操作数。结果,(1,eval)评估为一个值,而eval和   (评估) - 参考文献。"

(1, eval) evaluate to a value是什么意思?这个价值是什么?

1 个答案:

答案 0 :(得分:2)

eval完全取决于它的调用方式,是否为Direct call to eval

  

对eval函数的直接调用是表示为a的函数   符合以下两个条件的 CallExpression

     

Reference的结果   评估 CallExpression 中的 MemberExpression 有一个   environment record作为其基值   它的引用名称是“eval”。

     

调用抽象操作的结果   GetValue   Reference因为论证是   标准内置函数定义于   15.1.2.1

因此,如果您评估eval,它是对eval函数的引用(满足上述条件),而当您评估(1, eval)时,您将获得eval函数本身。调用这一个或另一个对eval产生影响。让我们比较语法树:

                    (eval)()
                 CallExpression
                    /      \
                   /        \
             (eval)         ()
        MemberExpression   Arguments
       PrimaryExpression
       Grouping Operator
               |
               |
              eval
           Expression
       PrimaryExpression
           Identifier

这是自上而下评估的。要进行调用,将对 MemberExpression 进行评估,为其评估分组运算符,它只返回基础Identfier的结果,即参考 resolving the name "eval" in the current scope。然后,the call does对该引用应用GetValue,该引用返回the eval function;然后称为。由于上述内容符合直接调用,因此code is executed differently

                     (1,eval)()
                   CallExpression
                      /      \
                     /        \
               (1,eval)        ()
         MemberExpression     Arguments
        PrimaryExpression
        Grouping Operator
                 |
                 |
              1,eval
           Expression
         Comma Operator
           /         \
          /           \
         1             eval
    Expression    AssignmentExpression
        ...              ...
PrimaryExpression   PrimaryExpression
      Literal         Identifier

同样,这是自上而下评估的。发生与上述相同的事情,但也是一个额外的步骤:comma operator。现在的观点是,它确实在eval标识符的评估结果上调用了GetValue,因此它确实返回了eval函数本身,而不仅仅是将解析它的引用。然后CallExpression将使用它获得的(函数),虽然它调用与上面相同的函数,但这不符合条件,仅进行间接调用