javascript“use strict”和Nick找到全局函数

时间:2011-09-02 23:14:35

标签: javascript ecmascript-5

所以我看到一个函数,它的简单性非常漂亮,因为它允许你在匿名函数中找到全局对象(当时依赖于环境可能不是窗口);但是当你抛出javascripts的“use strict”时;由于关键字'this'的变化评估,它会崩溃。有几种方法可以实现这一目标?

(function () {
    var win = function () {
        return (function () {
                return this;
            }());
        };
    //win now points to the global object no matter where it is called.
}());

现在,如果在“use strict”的上下文中调用它们,我们将失去所描述的功能,是否有任何可以在ES5严格模式下完成的等效项?

供参考

(function () {
    "use strict"
    //code here is in strict mode
}())

3 个答案:

答案 0 :(得分:8)

访问全局对象(在ES5之前)

  

如果您需要访问全局对象而不对标识符窗口进行硬编码,则可以从任何级别的嵌套函数范围执行以下操作:

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

这样,您始终可以获取全局对象,因为在调用的内部函数中   作为函数(也就是说,不是新的限制器),这应该始终指向   全球对象。

在严格模式下,ECMAScript 5实际上不再是这种情况, 因此,当您的代码处于严格模式时,您必须采用不同的模式。

  

例如,   如果您正在开发库,则可以将库代码包装在一个立即函数中   (在第4章中讨论)然后从全局范围,将此引用作为一个   你的直接功能的参数。

访问全局对象(在ES5之后)

  

通常,全局对象作为参数传递给immediate函数   它可以在函数内部访问,而不必使用窗口:这种方式使   代码在浏览器之外的环境中更具互操作性:

(function (global) {
    // access the global object via `global`
}(this));

“JavaScript模式,由Stoyan Stefanov撰写 (O'Reilly出版)。版权所有2010 Yahoo!,Inc.,9780596806750。“

答案 1 :(得分:8)

解决方案:

var global = Function('return this')();

适用于所有浏览器,引擎,ES3,ES5,严格,嵌套范围等。

略有变化将通过JSLINT:

var FN = Function, global = FN('return this')();

讨论

请参阅How to get the global object in JavaScript?

答案 2 :(得分:1)

以下是来自Perfection Kills的片段,使用全局评估。

var root = (function () {
    return this || (0 || eval)('this');
}());

ECMA3,ECMA5,Strict模式等兼容,通过JSLint。