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