一个有关js的this和闭包相关的问题

首先这个题是我自己学习闭包以及上下文,作用域等概念的时候琢磨出来的,主要是对第二个this不太理解:

var obj = {
    fn1:function(){
      console.log(this);
      var that = this;
      var f=function(){
        console.log(that);
        console.log(this);
      };
      return f;
    }
};
obj.fn1()();

第一个this和后面的that我基本能理解了,但是最后一个this是window我不太明白,按照对闭包的理解,这个this不是应该和that是相同的吗?

阅读 2.1k
3 个回答

最后一个 this 是 obj.fn1() 返回的,可以理解为 f = obj.fn1(),所以就是 f(),自然就是 window 对象了,因为 f() 等价于 window.f()

函数内部的this关键字指向于谁调用了这个函数,第一个调用是obj.f1(),那么第一个this就是指向obj,第二次调用是是第一返回的函数即f()调用,相当于window.f()此时函数是window调用的,那么第二个this自然就指向window

首先,感谢邀请!

这个是对 this 指向的基本理解相关问题,而且难度不大。

解答:

  1. obj.fn1()属于隐式调用,其中的this指向其上下文obj
  2. obj.fn1()()执行相当于f()。由于闭包,其中that指向其上一级词法作用域this,即obj
  3. 紧接着上一步骤。f()的执行中,属于独立函数执行,默认绑定window

建议参考文章《你不知道的javascript》笔记_this 系统学习一下,相关的问题基本上都能理解了

推荐问题
宣传栏