(1,eval)('this')vs eval('this')在JavaScript中?

我开始阅读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; }()); 

谁能告诉我? 谢谢。

(1,eval)和普通的旧eval的区别在于前者是一个 ,后者是左值。 如果它是一些其他的标识符会更明显:

 var x; x = 1; (1, x) = 1; // syntax error, of course! 

那就是(1,eval)是一个产生eval的expression式(就像说, (true && eval)(0 ? 0 : eval)会),但它不是对eval的引用。

你为什么在乎?

那么,Ecma规范认为对eval引用是一个“直接eval调用”,但是仅仅产生一个eval是一个间接的expression式,而间接的eval调用则保证在全局范围内执行。

事情我还是不知道:

  1. 在全球范围内,在什么情况下不进行直接评估?
  2. 在什么情况下全球范围内的一个functionthis 不会产生全球性的客体?

这里可以find更多的信息。

编辑

显然,我的第一个问题的答案是“几乎总是”。 直接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不能设置为nullundefined 。 它可以设置为其他的falsy值(0,'',NaN,false),但只是非常慎重。

我要说,你的来源正在遭受轻度和可逆的颅 – 直肠倒置,可能要考虑在Haskell花费一周的时间。

片段,

 var global = (function () { return this || (1, eval)('this'); }()); 

即使在严格模式下也会正确评估全局对象。 在非严格模式下,这个值是全局对象,但在严格模式下是undefined 。 expression式(1, eval)('this')将始终是全局对象。 其原因涉及间接诗句直接eval的规则。 直接调用eval的调用者的范围和string, this将计算在封闭的this值。 间接评估在全局范围内评估,就好像它们是在全局范围内的一个函数内部执行一样。 由于该函数本身不是严格模式函数,所以全局对象以this方式传入,然后expression式'this'求值为全局对象。 expression式(1, eval)只是强制eval间接返回全局对象的一种奇特的方式。

A1: (1, eval)('this')是不一样的,因为间接的直接调用eval的特殊规则。

A2:原作在严格模式下,修改版本不行。

对Q1:

我认为这是JS中逗号运算符的一个很好的例子。 我喜欢这篇文章中对逗号运算符的解释: http : //javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/

逗号运算符评估两个操作数(从左到右)并返回第二个操作数的值。

到Q2:

(1, eval)('this')被认为是间接的eval调用,在ES5中全局执行代码。 所以结果将是全球的背景。

http://perfectionkills.com/global-eval-what-are-the-options/#evaling_in_global_scope

Q1:以逗号分隔的多个连续的JavaScript语句取最后一条语句的值。 所以:

(1, eval)取最后一个参数为eval()函数的函数的值。 显然这样做是为了使eval()调用成为一个间接的eval调用,将在ES5的全局范围中进行评估。 细节在这里解释。

问题2:必须有一些没有定义全局的环境,但是确定了eval('this') 。 这是我能想到的唯一原因。