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

标签 javascript global

如果某个其他模块已经加载,我想检查脚本。

if (ModuleName) {
    // extend this module
}

但如果 ModuleName 不存在,则 throw

如果我知道全局对象 是什么,我就可以使用它。

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

但是因为我希望我的模块在浏览器和 noderhino 等平台上工作,所以我不能假设 window

据我所知,这在 ES 5 中用 "use strict" 不起作用;

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

这也会因抛出异常而失败

var MyGLOBAL = window || GLOBAL

看来我只剩下

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

这些情况都不会通过 JSLint。

我错过了什么吗?

最佳答案

好吧,你可以使用 typeof 运算符,如果标识符在作用域链的任何地方都不存在,它不会抛出一个 ReferenceError,它只会返回"undefined":

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

还请记住,全局代码中的 this 值指的是全局对象,这意味着如果您的 if 语句在全局上下文中,您可以简单地检查 this.ModuleName.

关于 (function () { return this; }()); 技术,你是对的,在严格模式下 this 的值将只是 未定义

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

  • 通过 Function 构造函数:

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

使用 Function 构造函数创建的函数不会继承调用者的严格性,只有当它们以 'use strict' 指令开始它们时它们才是严格的,否则它们是非严格的。

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

  • 通过间接eval调用,例如:

    "use strict";
    var get = eval;
    var global = get("this");
    

上面的代码可以工作,因为在 ES5 中,间接调用 eval,使用 global environment eval 代码的变量环境和词法环境。

查看详情 Entering Eval Code ,第 1 步。

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

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

var isStrictSupported = (function () { "use strict"; return !this; })();

关于javascript - 如何在 JavaScript 中获取全局对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277182/

相关文章:

python - 破解 python 的 import 语句

perl - Mojolicious 中用于处理不同路径的全局变量和线程

iOS 使用 xib + 全局方法覆盖 UIView (Swift)

javascript - TinyMCE - 使 url 可点击

javascript - 如何在使用 JavaScript 按住鼠标的同时重复一个函数?

javascript - 尝试根据指定的 jQuery 索引号将类添加到 div

mysql - 如何在 mysqli_query 语句中使用全局变量

javascript - 未初始化的变量作为参数工作正常

Javascript InnerHTML 不适用于 DIV 中的 DIV

javascript - 在严格模式下获取未知环境中全局对象的引用