Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 短作用域命名空间数组是什么意思?_Javascript - Fatal编程技术网

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
的每个属性都提供了单独的模块名称空间