小编典典

如何在JavaScript中获取全局对象?

javascript

我想在脚本中签入某个其他模块是否已加载。

if (ModuleName) {
    // extend this module
}

但是,如果ModuleName不存在,那就是throw

如果我知道那Global Object是什么,我可以使用它。

if (window.ModuleName) {
    // extend this module
}

但是,因为我希望我的模块与浏览器和工作noderhino等等,我不能假设window

据我了解,这在ES 5 with中不起作用"use strict"

var MyGLOBAL = (function () {return this;}()); // MyGlobal becomes null

这也会因抛出异常而失败

var MyGLOBAL = window || GLOBAL

所以好像我已经离开了

try {
    // Extend ModuleName
} 
catch(ignore) {
}

这些情况都不会通过JSLint。

我有什么想念的吗?


阅读 509

收藏
2020-05-01

共1个答案

小编典典

好吧,您可以使用typeof运算符,并且如果标识符在范围链的任何位置都不存在,则 不会
抛出ReferenceError,而只会返回"undefined"

if (typeof ModuleName != 'undefined') {
  //...
}

还要记住,this全局代码中的值是指全局对象,这意味着如果您的if声明位于全局上下文中,则只需检查即可this.ModuleName

关于这项(function () { return this; }());技术,您是对的,在严格模式下,this值将仅为undefined

在严格模式下,无论您身在何处,都有两种方法可以获取对Global对象的引用:

  • 通过Function构造函数:
    var global = Function('return this')();
    

Function构造函数创建的函数不会继承调用者的严格性,只有在以'usestrict'指令开头的函数体中它们才是严格的,否则它们是非严格的。

此方法与任何ES3实现兼容。

  • 通过 间接eval调用,例如:
    "use strict";
    

    var get = eval;
    var global = get(“this”);

上面的方法之所以有效,是因为在ES5中,对的间接调用eval将全局环境用作评估代码的变量环境和词法环境。

查看有关输入评估码(步骤1)的详细信息。

但是请注意,最后一种解决方案不适用于ES3实现,因为对ES3的间接调用eval会将调用者的变量和词法环境用作eval代码本身的环境。

最后,您可能会发现检测是否支持严格模式很有用:

var isStrictSupported = (function () { "use strict"; return !this; })();
2020-05-01