name="me";
  var tmp= { 
    name : "My Object", 
    getNameFunc : function(){ 
      return function(){ 
        alert(this+this.name+" l");
     }; 
    } 
}; 
tmp.getNameFunc()()提问 为什么这里的this为什么会是window吗  为什么不是tmp对象 不是应该一级一级的往上找 照理说在getNameFunc : function()是有tmp的this对象存在啊

解决方案 »

  1.   

    <script>
    name="me";
      var tmp= { 
        name : "My Object", 
        getNameFunc : function(){ 
       var that = this;
          return function(){ 
            alert(that+that.name+" l");
         }; 
        } 
    }; 
    tmp.getNameFunc()()
    </script>
      

  2.   

    我的理解是,tmp.getNameFunc()就负责把
    function(){ 
            alert(this+this.name+" l");
         }这个函数对象返回,不对里面的变量进行解释,返回后你再用()执行返回的值,就相当于直接执行
    (function(){ 
            alert(this+this.name+" l");
         })()了。
      

  3.   

    我们来分析下tmp.getNameFunc()()这语句吧。
    首先,这语句是写在window下的吧。tmp.getNameFunc()返回了一个函数,然后再执行这个返回的函数。相当于在全局作用域下调用了这个返回的函数,this当然是window了好吗。。
    如果希望this指向的是tmp,可以像1楼那样做,也可以  name="me";
      var tmp= { 
        name : "My Object", 
        getNameFunc : function(){ 
          alert(this+this.name+" l");
        }; 
      } 
      mp.getNameFunc();
    }; 
      

  4.   

    匿名函数里面的 this 指的就是window
      

  5.   

    1.当外层this没有找不到object的时候就会是window.// window
    alert(this);2.js是运行时绑定
    tmp.getNameFunc()返回的是method的引用。这个时候method并没有绑定在哪个对象上,因为不属于任何对象。所以直接调用tmp.getNameFunc()(),效果等同于直接
    (function(){ 
          alert(this+this.name+" l");
        })(); 
    this当然指向window了。
    另外,下面的代码可以强行将method指定到object。跟java的反射invoke有异曲同工之妙。
    tmp.getNameFunc().call(tmp);
      

  6.   


    我看到你说,这点和面向对象语言很不同。实际上他在设计思想上是完全相同的。
    比如java,他也有java.lang.reflect.Method类,他也可以从class中抽取Method。并且这个instance不绑定在任何对象上。只在invoke的时候动态绑定
      

  7.   

    很感谢 rainsilence 其实我也是按你这样想的可是感觉这个函数就是在对象上了 或许是对象上的函数的返回函数就不算是对象的方法了吧
    所以你这句话我理解了 希望是这样!