【问题标题】:javascript "use strict" and Nick's find global functionjavascript“使用严格”和尼克的查找全局函数
【发布时间】:2011-09-02 23:14:34
【问题描述】:

所以我看到了一个函数,坦率地说,它的简单性非常漂亮,因为它允许您在匿名函数中找到全局对象(取决于当时的环境可能不是 window );但是,当您抛出 javascripts 的“使用严格”时;由于对关键字“this”的评估发生了变化,它会崩溃。有几种方法可以做到这一点?

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

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

供参考

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

【问题讨论】:

标签: javascript ecmascript-5


【解决方案1】:

访问全局对象(ES5 之前)

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

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

这样你总能得到全局对象,因为在被调用的函数内部 作为函数(也就是说,不是作为 new 的收缩器),this 应该始终指向 全局对象。

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

例如, 如果你正在开发一个库,你可以将你的库代码包装在一个即时函数中 (在第 4 章中讨论过),然后从全局范围内,传递一个对 this 的引用作为 直接函数的参数。

访问全局对象(ES5 之后)

通常,全局对象作为参数传递给立即函数,因此 它可以在函数内部访问而无需使用 window: 这种方式使得 代码在浏览器之外的环境中更具互操作性:

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

“JavaScript 模式,作者 Stoyan Stefanov (奥莱利)。版权所有 2010 Yahoo!, Inc., 9780596806750。”

【讨论】:

  • 如果您使用包管理器将代码包装在额外的闭包中(即防止范围泄漏),该方法可能会失败。
【解决方案2】:

解决方案:

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

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

稍有变化将通过 JSLINT:

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

讨论

How to get the global object in JavaScript?

【讨论】:

  • 也很不错,在尝试让它与 jslint 一起工作时,我做了一个小修改 var f = Function, global = f('return this')();它在 jslint 中没有给出错误并正确地确定了全局范围(是的,我知道这只是他的建议,不是一成不变的,但我喜欢让事情通过“测试”可以这么说)
  • 对第二个变体的修改可以消除无关的 FN 变量:var global = (function(f){ return f('return this')(); })(Function);
【解决方案3】:

这是来自 Perfection Kills 的 sn-p,使用全局 eval。

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

ECMA3、ECMA5、Strict mode等兼容,通过JSLint。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-09-08
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多