代码如下: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中都应该是一个空对象才对,为什么能够正常作用呢?

解决方案 »

  1.   

    看这3句就OK了!GLOBAL.TERRY.LEE.name = "terry";//给GLOBAL.TERRY.LEE增加属性name,值为terry;
    var terry = GLOBAL.TERRY.LEE;//把GLOBAL.TERRY.LEE这个对象增加一个变量引用,terry
    alert(terry.name); //那么terry.name,实际就是GLOBAL.TERRY.LEE.name 
      

  2.   

    GLOBAL.namespace = function(str){
        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']
      

  3.   

    不是吧。。我上面仅仅声明了GLOBAL为对象,如果NAMESPACE方法不起作用的话GLOBAL.TERRY.LEE.name = "terry"会报出GLOBAL.TERRY is undifined才对,更不用说后面的属性了
      

  4.   

    你上面的namespace的作用,我觉得就是定义其存在而已。真正的核心赋值在下面!最后结果当然是显示terry!如果没有上面那一段,GLOBAL.TERRY.LEE会提示不是函数或对象或未定义!
      

  5.   

    GALOBAL['terry']={}; o=GALOBAL['terry']   //这里的arr[i]很明显第一次是TERRY第二次是LEE,而不是你说的terry和name
    其次,按照你这么个逻辑,最后输出也应该是空才对,而结果却是能正确输出terry