3

考虑以下代码片段:

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

当这个执行全局将指向window浏览器中的对象。
但这在严格模式下不起作用。为什么?

4

3 回答 3

10

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

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

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

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

有一篇详细的文章涵盖了这一点: http: //perfectionkills.com/global-eval-what-are-the-options/

于 2013-01-17T19:55:50.720 回答
4

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

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

根据ES5 规范,原因是:

如果this在严格模式代码中进行评估,则该this值不会强制转换为对象。or的this值不转换为全局对象nullundefined

于 2013-01-17T17:33:32.543 回答
1

来自MDN

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

所以这完全符合规定。

于 2013-01-17T17:31:23.763 回答