请考虑以下代码段:
var global = (function(){
return this;
}());
执行此操作时,global将指向浏览器中的window
对象。
但这在严格模式下不起作用。为什么呢?
答案 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
值不会强制转换为对象。this
值null
或undefined
未转换为全局对象
答案 2 :(得分:1)
来自the MDN:
for a strict mode function, the specified this is used unchanged:
...
"use strict";
function fun() { return this; }
assert(fun() === undefined);
所以这完全符合规定。