(1,eval)与plain old 之间的区别在于,
eval前者是一个 值 ,后者是一个左值。如果它是其他一些标识符,则将更加明显:
var x;x = 1;(1, x) = 1; // syntax error, of course!
那是
(1,eval)一个产生
eval(只是说
(true && eval)或
(0 ? 0 :eval)会)的表达式,但不是对的引用
eval。
你为什么在乎?
好了,规范了Ecma认为一个 参考 ,以
eval成为一个“直接的eval通话”,但只是产生一个表达式
eval是一间接一-
和间接的eval调用保证了在全球范围内执行。
我仍然不知道的事情:
- 在什么情况下 不能 在全局范围内执行直接eval调用?
- 在什么情况下
this
全局范围内的函数 不能 产生全局对象?
一些更多的信息可以在这里获得。
编辑
显然,我第一个问题的答案是“几乎总是”。直接
eval从 当前 范围执行。考虑以下代码:
var x = 'outer';(function() { var x = 'inner'; eval('console.log("direct call: " + x)'); (1,eval)('console.log("indirect call: " + x)'); })();毫不奇怪(heh-heh),它打印出来:
direct call: innerindirect call: outer
编辑
经过更多实验后,我将暂时说
this不能设置为
null或
undefined。可以将其设置为其他伪造的值(0,’‘,NaN,false),但只能非常故意。
我要说的是您的来源正在遭受轻度且可逆的颅直肠反转,并且可能要考虑花一周的时间在Haskell进行编程。



