如何在JavaScript中获取全局对象?
我想在脚本中签入某个其他模块是否已加载。
if (ModuleName) { // extend this module
}
但是,如果ModuleName
不存在,那就是throw
。
如果我知道那Global Object
是什么,我可以使用它。
if (window.ModuleName) { // extend this module
}
但是,因为我希望我的模块与浏览器和工作node
,rhino
等等,我不能假设window
。
据我了解,这在ES 5 with中不起作用"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
值将仅为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; })();
以上是 如何在JavaScript中获取全局对象? 的全部内容, 来源链接: utcz.com/qa/411100.html