短范围命名空间数组是什么意思?

时间:2015-02-09 12:33:55

标签: javascript

我有这段代码:

var ns;
(function(namespace, undefined) {
  function privateFunction() { ... };
  namespace.publicFunction = function() { ... };
}((ns = ns || {},
   ns.foo = ns.foo || {})));

我知道undefined使它真的未定义。但命名空间数组如何工作?它是否将全局函数和var绑定到两个名称空间?

所以我们给出了

(ns = ns || {},
 ns.foo = ns.foo || {})

作为命名空间变量。如果ns或ns.foo已存在,则将其实例化为空对象。我想。

此外,在代码中,您可以看到私有和公共函数以;结束时何时使用, ;而没有?

1 个答案:

答案 0 :(得分:2)

namespace不是数组,namespace是存储在密钥ns

下的全局foo对象中的对象
(ns = ns || {},
 ns.foo = ns.foo || {})

如果之前已初始化,则此代码会使用空对象初始化nsns.foo。然后ns.foonamespace变量作为函数输入。

由于ns是全局的,ns的所有属性都可以全局访问。因此,我们可以通过以下方式访问函数范围之外的公共函数:

ns.foo.publicFunction

但私有函数只能在定义它们的范围内(以及在子范围内)访问。例如,我们可以在privateFunction中使用publicFunction,但不能没有无效的父函数:

var ns;
(function(namespace, undefined) {
  function privateFunction() { console.log('hello') };
  namespace.publicFunction = function() { privateFunction(); };
}((ns = ns || {},
   ns.foo = ns.foo || {})));
ns.foo.publicFunction(); // hello
privateFunction(); //ReferenceError: privateFunction is not defined
ns.foo.privateFunction(); //TypeError: undefined is not a function

对于分号,函数声明不需要它,不像函数声明:

function privateFunction() { ... }
var privateFunction = function(){ ... };