function ns(namespace) {//假设传进一个包名:willerce.module.music
var _ns = namespace.split(".");//将包使用.分割为一个数组
var cur = window[_ns[0]];//window[_ns[0]]在这里就是 window.willerce ,获取 window.willerce 的值
if(cur === undefined) cur = window[_ns[0]] = {};//如果window.willerce 不存在,赋值一个空对象
var len = _ns.length;//得到包的长度,就是数组有多长
for(var i = 1; i < len; i++)//循环赋值
cur = cur[_ns[i]] = cur[_ns[i]] || {};//如果这个对象为undefined,就创建一个空对象
//上面这个循环,大概就是判断 willerce.module 是否存在,不存在,赋值为空对象 {},然后将自己cur赋值为willerce.module
//接着再判断willerce.module.music,同理,不存在就初始化。将 cur 赋值为 cur,这时 cur 就是 willerce.module.music 了
//最后返回cur
return cur;
}
这里的命名空间,其实就是一个对象。例如 willerce.module.music 这3段都是对象
我们在给 music 赋值的时候,必须保证 willerce , willerce.module 都是一个对象(包含空对象),而不是 undefined。如果是 undefined,就要赋值为 {}
所以这段代码的过程就是,判断对象是否初始化了,如果没,就始化为空对象。
看懂这段代码,主要就是注意 cur 的变化。还有 undefined || {} 的意思是:如果第一个为undefined,就取第二个。