(1,eval)
和plain old之间的区别在于,eval
前者是一个值,后者是一个左值。如果它是其他一些标识符,则将更加明显:
var x;
x = 1;
(1, x) = 1;
那是(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: inner
indirect call: outer
编辑
经过更多实验后,我将暂时说this
不能设置为null
或undefined
。它可以被设置为其它falsy值(0,“”,NaN的,假的),但只有极故意。
我要说的是您的来源正在遭受轻度且可逆的颅直肠反演,并且可能要考虑花一周的时间在Haskell进行编程。