我正在检查this article,在此行(1,eval)(‘1+1’)
"逗号运算符(在(1,eval)示例中)对其执行GetValue 操作数。结果,(1,eval)评估为一个值,而eval和 (评估) - 参考文献。"
(1, eval) evaluate to a value
是什么意思?这个价值是什么?
答案 0 :(得分:2)
eval
完全取决于它的调用方式,是否为Direct call to eval
:
对eval函数的直接调用是表示为a的函数 符合以下两个条件的 CallExpression :
Reference的结果 评估 CallExpression 中的 MemberExpression 有一个 environment record作为其基值 它的引用名称是“
eval
”。
因此,如果您评估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将使用它获得的值(函数),虽然它调用与上面相同的函数,但这不符合条件,仅进行间接调用。