我有这段代码:
(function(){
var d = {
sayHello: function(a){
document.writeln("Hello "+a)
}
}
this.d = d;
})();
我知道这是一个IIFE,但最后一行让我感到困惑。对象d
是否超出范围?它像一个可以访问的API一样使用,对吧?
this.d = d
表示d
现在是范围内的变量,可以使用吗?
还有其他方法可以实现吗?
答案 0 :(得分:4)
由于直接使用()
调用IIFE,因此没有“上下文”,因此this
将默认(在非ES5严格模式中)为window
。
因此该行相当于:
window.d = d;
是的,因此将d
暴露在全局命名空间中。
您不应该使用此方法,因为它与ES5 "use strict"
不兼容,后者在没有显式上下文的情况下设置this = null
。我推荐这样的东西,而不是:
var MYNAMESPACE = MYNAMESPACE || {};
MYNAMESPACE.SUBPACKAGE = (function() {
...
return d;
})();