javascript - 尝试理解 JavaScript 代码//命名空间

标签 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“root”(它恰好是浏览器的全局命名空间的副本(或引用?)是:“窗口”))。

因此,如果某个部分不在“root”中(==“未定义”),那么我们会将键/值对 {part: {}} 添加到“root”中。

现在我不明白的事情是: 在 if 语句之后,我们有一个赋值,将 root[parts[i]] 分配给变量“root”本身。为什么?

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

最后一项任务有什么用?

另外:变量 root 是对全局命名空间“window”的引用吗?那么我写入“root”的任何内容都会写入“window”吗?还是副本?

谁能帮我解答一下吗?

最佳答案

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']

关于javascript - 尝试理解 JavaScript 代码//命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42614174/

相关文章:

Python super 方法: class name not defined

php - 加载同一类的多个版本

javascript - 是否有使用 DIV 容器而不是列表来放置单独内容的轮播?

javascript - 如何处理 javascript 中输入元素状态的编程更改

javascript - 仅在全日历中允许背景事件的 eventOverlap

xml - Xquery 不适用于命名空间

android - 我可以修改 "tools"命名空间吗?

xml - android XML 命名空间的故事是什么?

javascript - 如何添加不可移动的页脚信用

javascript - 在 React.render() 中返回多个元素