考虑以下代码片段:
var global = (function(){
return this;
}());
当这个执行全局将指向window
浏览器中的对象。
但这在严格模式下不起作用。为什么?
考虑以下代码片段:
var global = (function(){
return this;
}());
当这个执行全局将指向window
浏览器中的对象。
但这在严格模式下不起作用。为什么?
ES5 规范允许您通过间接 eval 检索全局对象。
var global = (0, eval)('this');
这适用于严格和非严格模式。
间接 eval 基本上是通过值而不是引用调用 eval(或者值绑定的名称不为“eval”)。间接eval在全局范围内执行,this
在全局范围内指的是全局对象。
有一篇详细的文章涵盖了这一点: http: //perfectionkills.com/global-eval-what-are-the-options/
原因已经被dystroy解释了:this
在严格模式下不会是全局对象。这是解决方法(假设在全局范围内运行):
var global = (function(g){
return g;
}(this));
根据ES5 规范,原因是:
如果
this
在严格模式代码中进行评估,则该this
值不会强制转换为对象。or的this
值不转换为全局对象null
undefined
来自MDN:
for a strict mode function, the specified this is used unchanged:
...
"use strict";
function fun() { return this; }
assert(fun() === undefined);
所以这完全符合规定。