我想在脚本中签入某个其他模块是否已加载。
if (ModuleName) { // extend this module }
但是,如果ModuleName不存在,那就是throw。
ModuleName
throw
如果我知道那Global Object是什么,我可以使用它。
Global Object
if (window.ModuleName) { // extend this module }
但是,因为我希望我的模块与浏览器和工作node,rhino等等,我不能假设window。
node
rhino
window
据我了解,这在ES 5 with中不起作用"use strict";
"use strict"
var MyGLOBAL = (function () {return this;}()); // MyGlobal becomes null
这也会因抛出异常而失败
var MyGLOBAL = window || GLOBAL
所以好像我已经离开了
try { // Extend ModuleName } catch(ignore) { }
这些情况都不会通过JSLint。
我有什么想念的吗?
好吧,您可以使用typeof运算符,并且如果标识符在范围链的任何位置都不存在,则 不会 抛出ReferenceError,而只会返回"undefined":
typeof
ReferenceError
"undefined"
if (typeof ModuleName != 'undefined') { //... }
还要记住,this全局代码中的值是指全局对象,这意味着如果您的if声明位于全局上下文中,则只需检查即可this.ModuleName。
this
if
this.ModuleName
关于这项(function () { return this; }());技术,您是对的,在严格模式下,this值将仅为undefined。
(function () { return this; }());
undefined
在严格模式下,无论您身在何处,都有两种方法可以获取对Global对象的引用:
Function
var global = Function('return this')();
用Function构造函数创建的函数不会继承调用者的严格性,只有在以'usestrict'指令开头的函数体中它们才是严格的,否则它们是非严格的。
'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; })();