我有一个遗留的 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/