严格模式下的全局对象访问

时间:2013-01-17 17:28:20

标签: javascript ecmascript-5

请考虑以下代码段:

var global = (function(){
    return this;
}());

执行此操作时,global将指向浏览器中的window对象。
但这在严格模式下不起作用。为什么呢?

3 个答案:

答案 0 :(得分:10)

ES5规范允许您通过间接eval检索全局对象。

var global = (0, eval)('this');

这适用于严格和非严格模式。

间接eval基本上是通过值而不是引用来调用eval(或者没有值绑定的名称是“eval”)。间接eval在全局范围内执行,全局范围中的this是指全局对象。

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

上有一篇详细的文章

答案 1 :(得分:4)

原因已由dystroy解释:this不会是严格模式下的全局对象。这是解决方法(假设它在全局范围内运行):

var global = (function(g){
    return g;
}(this));

根据ES5 specification,原因是:

  

如果在严格模式代码中评估this,则this值不会强制转换为对象。 thisnullundefined未转换为全局对象

答案 2 :(得分:1)

来自the MDN

for a strict mode function, the specified this is used unchanged:
...
"use strict";
function fun() { return this; }
assert(fun() === undefined);

所以这完全符合规定。