我有一个遗留的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;本身。为什么?
最后一个分配对什么有益?
另外:变量root是否是对全局命名空间的引用&#34; window&#34;?所以我写的任何东西&#34; root&#34;将写入&#34;窗口&#34;?或者是副本?
任何人都可以开导我吗?
答案 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']