我有这段代码:
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已存在,则将其实例化为空对象。我想。
此外,在代码中,您可以看到私有和公共函数以;
结束时何时使用,
;
而没有?
答案 0 :(得分:2)
namespace
不是数组,namespace
是存储在密钥ns
foo
对象中的对象
(ns = ns || {},
ns.foo = ns.foo || {})
如果之前已初始化不,则此代码会使用空对象初始化ns
和ns.foo
。然后ns.foo
将namespace
变量作为函数输入。
由于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(){ ... };