从内部扩展命名空间模块

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.我理解正确吗?

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.nsns

您可以从任何地方访问 window.ns,因为它属于全局范围。

只有 IIFE 和其中的函数可以访问 ns,因为它是在 IIFE 的词法范围内声明的。然而,由于 IIFE returns ns,可以将 return 值存储在全局范围内的变量中,从而使 ns 在IIFE.