代码如下:var GLOBAL = {};
//命名空间
GLOBAL.namespace = function(str){
var arr = str.split("."),o=GLOBAL;
for(var i = (arr[0]=="GLOBAL") ? 1 : 0; i < arr.length; i++){
console.log(o[arr[i]]); //step 1
o[arr[i]] = o[arr[i]] || {};//step 2
console.log(o[arr[i]]);//step 3
o = o[arr[i]]; //step 4
console.log(o);//step 5
}
}
GLOBAL.namespace("TERRY.LEE");
GLOBAL.TERRY.LEE.name = "terry";
var terry = GLOBAL.TERRY.LEE;
alert(terry.name);这是一段命名空间的创建代码。
我的理解是这样:当我创建名为TERRY.LEE的命名空间时,代码走进第一个循环,i=0走到位于step1时,打印信息为undefined,这个很好理解,GLOBAL对象是一个空对象
走到第二部时,理论上因为o[arr[i]]是undefined,因此o[arr[i]]会被定义为{}也就是一个空对象,到第四步将空对象赋给GLOBAL对象
如果按这个逻辑那么不管几次循环GLOBAL中都应该是一个空对象才对,为什么能够正常作用呢?
//命名空间
GLOBAL.namespace = function(str){
var arr = str.split("."),o=GLOBAL;
for(var i = (arr[0]=="GLOBAL") ? 1 : 0; i < arr.length; i++){
console.log(o[arr[i]]); //step 1
o[arr[i]] = o[arr[i]] || {};//step 2
console.log(o[arr[i]]);//step 3
o = o[arr[i]]; //step 4
console.log(o);//step 5
}
}
GLOBAL.namespace("TERRY.LEE");
GLOBAL.TERRY.LEE.name = "terry";
var terry = GLOBAL.TERRY.LEE;
alert(terry.name);这是一段命名空间的创建代码。
我的理解是这样:当我创建名为TERRY.LEE的命名空间时,代码走进第一个循环,i=0走到位于step1时,打印信息为undefined,这个很好理解,GLOBAL对象是一个空对象
走到第二部时,理论上因为o[arr[i]]是undefined,因此o[arr[i]]会被定义为{}也就是一个空对象,到第四步将空对象赋给GLOBAL对象
如果按这个逻辑那么不管几次循环GLOBAL中都应该是一个空对象才对,为什么能够正常作用呢?
var terry = GLOBAL.TERRY.LEE;//把GLOBAL.TERRY.LEE这个对象增加一个变量引用,terry
alert(terry.name); //那么terry.name,实际就是GLOBAL.TERRY.LEE.name
var arr = str.split(".")
,o=GLOBAL; //o指向了GLOBAL对象 或者说 o和 GLOBAL指向同一个对象
for(var i = (arr[0]=="GLOBAL") ? 1 : 0; i < arr.length; i++){ //如果第一个字符串==‘GLOBAL’则过滤 从第2个字符串开始
console.log(o[arr[i]]); //step 1
o[arr[i]] = o[arr[i]] || {};//step 2 //初始化 o[arr[i]] 相当于初始化GLOBAL[arr[i]]
console.log(o[arr[i]]);//step 3
o = o[arr[i]]; //step 4 //让 o指向 o[arr[i]]
console.log(o);//step 5
}
}//上面的循环变迁调用 写出来就是
o=GLOBAL
第一次循环
GALOBAL['terry']={}; o=GALOBAL['terry']
第二次循环
GALOBAL['terry']['name']={};o=GALOBAL['terry']['name']
其次,按照你这么个逻辑,最后输出也应该是空才对,而结果却是能正确输出terry