如果某个其他模块已经加载,我想检查脚本。
if (ModuleName) {
// extend this module
}
但如果 ModuleName
不存在,则 throw
。
如果我知道全局对象
是什么,我就可以使用它。
if (window.ModuleName) {
// extend this module
}
但是因为我希望我的模块在浏览器和 node
、rhino
等平台上工作,所以我不能假设 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/