代码:
;(function (ns, undefined) {
ns = {
foo1: "bar1"
}
this.ns = {
foo2: "bar2"
};
ns.foo3 = "bar3";
return ns;
})(window.ns = window.ns || {});
结果:
致电ns
结果:Object {foo2: "bar2"}
IIFE返回:Object {foo: "bar1", foo3: "bar3"}
1。我理解正确吗?
ns
是IIFE中的新私有对象,然后返回this.ns
属于window.ns
并展开 2。为什么this
中有this.ns
个关键字?
由于在全局上下文中调用了IIFE,因此this
关键字已链接
with global,因此:document.ns
(命名空间)
第3。如何正确访问IIFE中的this.ns
属性?
例如console.log(this.ns.foo2)
- 这是正确的方式吗?
4。由于我将window.ns
作为ns
参数传递,为什么我必须使用this.ns
而不仅仅是ns
?
答案 0 :(得分:2)
窗口对象在运行时没有.ns
属性。因此window.ns
将评估为undefined
,||
表达式将强制转换为false
,{}
将强制转换为true
。因此,||
表达式最终为false || true
,导致window.ns = {}
作为参数传递给IIFE。
ns
参数传递window.ns = {}
参数,然后ns = {foo1: 'bar1'}
为ns
分配新值,然后ns.foo3 = 'bar3
添加另一个属性/值对它。
this
在全局范围中声明的函数中使用时,默认为全局对象(浏览器中的窗口对象)。因此,this.ns = {foo2: 'bar2'}
会在窗口对象上创建一个名为.ns
且值为{foo2: 'bar2'}
的新属性。
window.ns
和ns
?您可以从任何地方访问window.ns
,因为它属于全球范围。
只有IIFE及其中的函数可以访问ns
,因为它是在IIFE的词法范围内声明的。但是,由于IIFE返回ns
,因此可以将返回值存储在全局范围内的变量中,从而使ns
可以在IIFE的词法范围之外访问。