代码一
 var name = "The Window";  var object = {
    name : "My Object",    getNameFunc : function(){
      return function(){
        return this.name;
      };    }  };  alert(object.getNameFunc()());
代码二var object = {
    name : "My Object",    getNameFunc : function(){
                  var that = this;
      return function(){
        return this.name;
      };
    }  };
 alert(object.getNameFunc()());问题1.
为啥代码一中 ,运行结果不是My object,而且是方法调用,this的运行环境是object对象中呀
代码二为啥这样一改,就变成了M yobject
希望有详细解释 看了阮一峰的博客产生的疑问
问题2
sublimeText 出现了[WinError 2
] 系统找不到指定的文件。不能编译js代码,不知道如何解决

解决方案 »

  1.   

    代码2
     return this.name;
    应该是
     return that.name;
      

  2.   

    其实等同
    var _=object.getNameFunc()
    _()
    所以this是window
      

  3.   

    代码一的object.getNameFunc()执行后this已经不再指向object,而是全局作用域,所以输出是The Window;代码二把全局作用域的引用放到that里了,所以object.getNameFunc()执行以后this并没有被改掉,还是指向object,所以输出是My Object。
      

  4.   

    object.getNameFunc()执行完成之后返回function(){return this.name;}; 此时的this指向是object对象   然后又执行了一次 , 现在是一个函数立即执行  this指向window
      

  5.   

    。。话说代码二不会报错么。。 全局 window.name 貌似是空呀。。 应该会弹出空白
    如果是that写错了的话  很正常 that=object;
      

  6.   

    要么就是代码敲错了,
    代码二里是   return that.name
      

  7.   

    ====this
      this代表的是一个对象,this所在环境的对象
    this一般出现在函数的执行体内部,代表的是函数的持有者(方法持有者)
    如果this出现在非函数内部,代表的是window对象
    this最终代表的是调用者(new call apply   this可以改变,代表的是调用)
    总结:this就是离它最近的function修饰的持有对象
    最近: 不是哥哥,是父级
    修饰: 只有对象的成员是这个函数时,才叫持有者
    var name = "The Window";
    var object = {    
    name: "My Object",
        getNameFunc: function() {      
    return function() {        
    return this.name;      
    };     
    }
    };
    alert(object.getNameFunc()());
    解析:object.getNameFunc()() 
    首先是object.getName() ===》调用这个方法,得到一个返回值:
     function() {        
    return this.name;      
    };
    ===>此时返回的函数暴露在了window环境里面,因为你是在window的环境下调用的所以它返回的函数也会暴露在window环境下;
    我们在往下分析:
    object.getNameFunc()()
    由于object.getName()  返回了一个函数到window下,所以我们此时可以写成
    (window.这个函数)==》 function() {        
    return this.name;      
    }();this就是离它最近的function修饰的持有对象,此时持有它的就是window
    所以我们就这里的this就是window对象
    运行这段函数 function() {        
    return this.name;      
    }
    我们就可以得到  alert出 : The Window
    你的代码2我运行弹出来的是空白,检查下你第二段代码是否正确
      

  8.   

    我只回答问题一,不用Sublime
    因为getNameFunc的调用位置为object,所以代码二中的that实际上保存也就是object,但是return返回函数的话,会导致this绑定丢失,因为返回的函数实际上为隐式声明(假如你返回的函数名为fn1,则隐私声明为var fn=fn1)作用域则变为接收该函数的作用域,在这里则变成全局,使用that把this存储起来,可以达到你要的效果,实则引用了getNameFunc中的this
    关于隐式丢失,可以参考以下代码
    function foo(){
          console.log(this.a);
        }
        var obj={
          a:2,
          foo:foo
        };
        var bar=obj.foo;
        var a="window";
        bar()
      

  9.   

    代码中的var bar=obj.foo;,是为函数创建了别名,相当于bar直接调用了foo,所以foo的上下文环境也就发生了变化,成为了bar所在的作用域
      

  10.   

    问题1的object.getNameFunc()在词法作用域中不属于任何对象,所以里面的this在严格模式下是undefined,非严格模式下就变成window了