从内部扩展命名空间模块

时间:2016-11-13 10:02:20

标签: javascript oop this module-pattern

代码:

;(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

1 个答案:

答案 0 :(得分:2)

IIFE叫什么参数?

窗口对象在运行时没有.ns属性。因此window.ns将评估为undefined||表达式将强制转换为false{}将强制转换为true。因此,||表达式最终为false || true,导致window.ns = {}作为参数传递给IIFE。

IIFE内部会发生什么?

ns参数传递window.ns = {}参数,然后ns = {foo1: 'bar1'}ns分配新值,然后ns.foo3 = 'bar3添加另一个属性/值对它。

this在全局范围中声明的函数中使用时,默认为全局对象(浏览器中的窗口对象)。因此,this.ns = {foo2: 'bar2'}会在窗口对象上创建一个名为.ns且值为{foo2: 'bar2'}的新属性。

如何访问window.nsns

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

只有IIFE及其中的函数可以访问ns,因为它是在IIFE的词法范围内声明的。但是,由于IIFE返回ns,因此可以将返回值存储在全局范围内的变量中,从而使ns可以在IIFE的词法范围之外访问。