Javascript 短作用域命名空间数组是什么意思?
我有以下代码片段:Javascript 短作用域命名空间数组是什么意思?,javascript,Javascript,我有以下代码片段: var ns; (function(namespace, undefined) { function privateFunction() { ... }; namespace.publicFunction = function() { ... }; }((ns = ns || {}, ns.foo = ns.foo || {}))); 我理解,未定义使它真正未定义。但是名称空间数组是如何工作的呢?它是否将全局函数和var绑定到这两个名称空间 所以我们给 (ns
var ns;
(function(namespace, undefined) {
function privateFunction() { ... };
namespace.publicFunction = function() { ... };
}((ns = ns || {},
ns.foo = ns.foo || {})));
我理解,未定义使它真正未定义。但是名称空间数组是如何工作的呢?它是否将全局函数和var绑定到这两个名称空间
所以我们给
(ns = ns || {},
ns.foo = ns.foo || {})
作为名称空间变量。如果ns或ns.foo已存在,则将其实例化为空对象。我想是吧
此外,在代码中,您可以看到私有函数和公共函数以
结尾代码>何时使用,
和nothing?命名空间
不是数组,命名空间
是存储在全局ns
对象中键foo
(ns = ns || {},
ns.foo = ns.foo || {})
如果以前未初始化ns
和ns.foo
,则此代码将使用空对象初始化ns
。然后,ns.foo
作为namespace
变量进入函数输入
由于ns
是全局的,因此ns
的所有属性都可以全局访问。因此,我们可以通过以下方式访问功能范围之外的公共功能:
ns.foo.publicFunction
但是私有函数只能在定义它们的范围内(以及在子范围内)访问。例如,我们可以在publicFunction
中使用privateFunction
,但不能没有一个单一的父函数:
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(){ ... };
“由于ns
是全局的,ns
的所有属性也将是全局的”不,它们只能通过window.ns
(或仅通过全局范围内的ns
)访问,而不能直接通过window
。您没有提到的一个优点是,ns.foo.publicFunction
也可以访问privateFunction
。@Teemu“不直接通过窗口”是什么意思<代码>变量全局='bar';(函数localScope(){console.log(“我是全局的:+global)})()代码>-在这里,我定义了全局变量ns
(如上面的代码所示),并在局部范围内访问了该变量。“…ns
的所有属性将不是全局的。这正是我们设置名称空间的原因…我现在明白它是如何工作的了(ns=ns | |{},ns.foo=ns.foo | |{})
将计算并实例化ns和ns.foo,并使用最后一个作为参数。谢谢您的澄清。@Teemu我想ns
的每个属性都提供了单独的模块名称空间