(function(){
var w=this;//为什么要使用w代替this,直接使用this不可以吗?为什么?
var o=w.hh=function(){//此处的hh属于哪一个对象?
return o.p  //此处返回值为o.p,那不是就成了o=o.p了吗?对象等于他的属性???不理解......
};
})();

解决方案 »

  1.   

    1.this是window对象,那么hh就变成了window对象下的全局函数
    2.var o = function(){return o.p}没什么问题啊,这里是函数声明,又没有执行,怎么就变成o=o.p了?(function(){
    var w=this;//为什么要使用w代替this,直接使用this不可以吗?为什么
    var o=w.hh=function(){//此处的hh属于哪一个对象?
        return  o.p;  //此处返回值为o.p,那不是就成了o=o.p了吗?对象等于他的属性???不理解......
    };
    o.p = "hello world!";
    alert(o());//hello world
    })()alert(hh());//hello world
      

  2.   

    看来浴火凤凰在刻苦钻研js啊。我也来插一句嘴。<script>
    (function(){//这个匿名函数定义完毕之后被立即执行,这点楼主肯定明白。
    var w=this;//这里这么写,我觉得是个人习惯,用w代替this(其实是window)
    //然后对this的操作变成对w的操作,有时候理解起来要方便一些
    var o=w.hh=function(){
        return o.p;
    };
    //上面给window一个属性叫做hh,其实这个hh指向一个function. 
    //同时有一个局部变量o也指向这个函数。(先不管o.p返回什么);
    o.p = 123;//给o一个属性p,并且赋值123,以方便测试。
    alert('o:' + o);//这里测试发现o指向一个函数
    })();
    alert(window.hh);//这里测试发现给window添加一个属性叫做hh,hh指向一个函数。
    alert(this.hh());//这里能够打印出闭包中的私有变量的属性。然而这个属性
    //是无法通过其他手段获得到的。只有通过闭包返回的函数得到。
    </script>
    //总体来说,这段代码拿来学习还可以。要是在项目中写出来估计会被后来人骂死。
      

  3.   

    上面比较难以理解的是
    var o = function(){return o.p;}
    也就是楼主说的那不是就成了o=o.p了吗?这里是比较难以理解。
    要理解的就是函数也是对象。o是一个函数,同时o也是一个对象。是函数就可以被执行,使对象他就能够拥有其他的属性(比如p)。
    给一个更简化的例子。<script>
    var f = function(){
    alert('i am a function. i was executed'); 
    return "I am the function's return value";
    };
    f.attr = "i am the object f's property.";
    alert(f);
    alert(f());
    alert(f.attr);
    </script>
      

  4.   

    1楼和3楼说的都太好了,其实我就觉得
    var o=w.hh=function(){
        return o.p;  
    };
    这样写应该更好看些:
    var o;
    w.hh = function(){return o.p};
      

  5.   

    对象重新赋值为对象的属性是可以的,js有自动的类型转换。var str = new String('hello');
    str = str.length;
    alert(str);这么写可以就等同于var str = new String('hello');
    var n= 0;
    n= str.length;
    alert(n);
    难道是牛人们又在玩啥游戏?非要用一个变量作为多个用途?
      

  6.   

    var o=w.hh也就是o.p==w.hh.p这样的话好像没有闭包
      

  7.   


    var o=w.hh=function(){
        return o.p;
    };//这里不是大材小用了吗?一般情况下o会有多个属性,这里只返回一个。
    //那么o():就应该是返回它的属性了?
    //还有一个疑问:那么它的其他属性怎样写?
      

  8.   

    可以这么理解,为了返回o的主属性
    var string = function(){
        return string.value;
    };
    string.value = "abcd";
    string.len = 4; //其它属性
    alert(string()); //string有value,len...等属性,主要属性为value,所以string()只要value
      

  9.   


    <script>
    window.name="凤凰的疑惑";//为了后面辨别this或w,做此赋值
    (
      function(s){    alert('参数已经正确传递进来,那就是 :  "'+s+'"');//题外话
        alert(this.name+'\n\n如果this.name是"凤凰的疑惑",那证明this是window对象');//    var w=this;//不使用w代替this当然也可以,个人喜好.看看下面的变化就知道了//    var o=w.hh=function(){//此处的hh属于window,也就是声明成为全局变量o
        var o=this.hh=function(){//此处的hh属于window,也就是声明成为全局变量o
          return o.p
          //【1、那不是就成了o=o.p了吗?对象等于他的属性?】:此处是覆盖了o 
          //为证明这一点,你可以把return o.p变成return o,看看什么结果      //【2、关键是o.p在此之前并没有定义啊!他是在后面才定义的...】没调用o的时候前后定义有什么关系?仅仅是定义而已    };
        
        o.p=12345;
        o.h="aaaaaaaaaaaaaaaaaaaaaaaaa"
        var z=new o();//这里调用o函数
        alert(z);
        alert(z.h)
        //alert(o.p)
      }
    )('我是测试题目的参数');alert(hh)/*这里直接调用hh的构造*/
    alert(hh())/*这里直接调用hh的函数*/
    //alert(o)//当然报错为空</script>