试图理解JavaScript代码//命名空间

时间:2017-03-05 21:20:43

标签: javascript namespaces

我有一个遗留的PHP项目,包含许多我试图理解的JavaScript代码。

这些JS文件中的每一个都以此代码片段开头:

var myproject = myproject || {};
registerNamespace = function(namespace) {
    var parts = namespace.split(".");
    var root = window;
    for ( var i = 0; i < parts.length; i++) {
        if (typeof root[parts[i]] == "undefined") {
            root[parts[i]] = {};
        }
        root = root[parts[i]];
    }
};

registerNamespace('myproject.main');

因此我们在第一行创建了一个名为myproject的命名空间。

函数registerNamespace将一个点分隔的字符串拆分成它的部分,并将{part:{}}添加到var&#34; root&#34; (它恰好是浏览器的全局命名空间的副本(或对?的引用)(即:&#34; window&#34;))。

因此,如果某个部件不在&#34; root&#34;已经(==&#34;未定义&#34;),然后我们将键/值对{part:{}}添加到&#34; root&#34;。

现在我不明白的事情: 在if语句之后,我们有一个赋值,它将root [parts [i]]赋给变量&#34; root&#34;本身。为什么?

  • 在循环的第一次迭代中,我们有部分[i] ==&#34; myproject&#34;和root [parts [i]] == {}
  • 所以赋值是root = {} ???

最后一个分配对什么有益?

另外:变量root是否是对全局命名空间的引用&#34; window&#34;?所以我写的任何东西&#34; root&#34;将写入&#34;窗口&#34;?或者是副本?

任何人都可以开导我吗?

1 个答案:

答案 0 :(得分:1)

root用作参考。

首先,它指向全局“窗口”对象。如果未将myproject定义为window的属性,则会将window.myproject分配给新对象。

然后root用于指向window.myproject。如果main未定义为window.myproject的属性,window.myproject.main已分配给新对象。

如果使用字符串'myproject.main.mynamespace'调用registerNamespace函数,那么root将被重新分配给引用window.myproject.main,依此类推。

root = window // root now points to the window object
root['main'] = {} // a new object is created, and root['main'] now points to it
root = root['main'] // root now points to root['main']