我开始阅读JavaScript模式,一些代码使我感到困惑。
var global = (function () { return this || (1, eval)('this'); }());
这是我的问题:
Q1:
(1, eval) === eval?
(1, eval) === eval
为什么以及如何运作?
Q2:为什么不只是
var global = (function () { return this || eval('this'); }());
要么
var global = (function () { return this; }());
(1,eval)与plain old 之间的区别在于,eval前者是一个 值 ,后者是一个左值。如果它是其他一些标识符,则将更加明显:
(1,eval)
eval
var x; x = 1; (1, x) = 1; // syntax error, of course!
那是(1,eval)一个产生eval(只是说(true && eval)或(0 ? 0 : eval)会)的表达式,但不是对的引用eval。
(true && eval)
(0 ? 0 : eval)
你为什么在乎?
好了,规范了Ecma认为一个 参考 ,以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。可以将其设置为其他伪造的值(0,’‘,NaN,false),但只能非常故意。
null
undefined
我要说的是您的来源正在遭受轻度且可逆的颅直肠反转,并且可能要考虑花一周的时间在Haskell进行编程。