(1,eval)
和plain old之间的区别在于eval
前者是一个值,后者是一个左值。如果是其他标识符会更明显:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
这是(1,eval)
一个产生的表达式eval
(就像 say(true && eval)
或(0 ? 0 : eval)
will 一样),但它不是对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)');
})();
毫不奇怪(呵呵),这打印出来:
direct call: inner
indirect call: outer
编辑
经过更多的实验,我将暂时说this
不能设置为null
或undefined
。它可以设置为其他虚假值(0、''、NaN、false),但只是非常有意地。
我要说的是您的消息来源患有轻度且可逆的颅直肠内翻,可能需要考虑在 Haskell 上花一周时间进行编程。