JavaScript中的(1,eval)('this')vs eval('this')?我开始阅读JavaScript模式,一些代码让我困惑。var global = (function () {
return this || (1, eval)('this');}());这是我的问题:Q1:(1, eval) === eval?为什么以及如何运作?Q2:为什么不呢var global = (function () {
return this || eval('this');}());要么 var global = (function () {
return this;}());
3 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
(1,eval)
和旧的区别在于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)'); })();
毫不奇怪(嘿嘿),这打印出来:
direct call: inner indirect call: outer
编辑
经过更多的实验,我将暂时说this
不能设置为null
或undefined
。它可以设置为其他假值(0,'',NaN,false),但只是非常刻意。
我要说你的来源患有轻度和可逆的颅 - 直肠反转,并且可能想考虑在Haskell中花一周的编程。
添加回答
举报
0/150
提交
取消