this关键字问题

clipboard.png

如图,框框中的this为什么会是Person对象而不是windows呢,不是说settimeout函数的执行对象是windows,this都会指代windows,那settimeout中出现的this不应该都是windows吗?
就像为什么下面这个匿名函数我绑定this,但是并没有指向person对象,还是打印的XL大写?只能通过that = this这样来转换才能改变this指向 这是为什么呢

    var name="XL";
    var person={
        name:"xl",
        showName:function(){
            console.log(this.name);
        },
        sayName:function(){
            (function(callback){
                callback();
            }.bind(this))(this.showName)
        }
    }
    person.sayName(); //XL
阅读 2.2k
4 个回答

两个地方你都是把匿名函数的this绑定到了person对象上,不同的是第二个地方你是通过callback函数打印name,你并没有绑定这个函数的this所以是指向window对象的name

因为你给setTimeout函数动态的传入了一个this,而这个this正好指向的就是person,所以你取name变量的时候当然是先在person里面找name。如果你不给setTimeout函数动态的传入this,那默认this才是指向window。
第二种情况你这样的的调用方式相当于是直接在window中调用了callback,根据谁调用指向谁的原则,所以this执行window。

var name = "window";
function Person(name){
  this.name = name;
  this.showName=function(){
    console.log(this.name);
  }
  this.sayName = function() {
    (function(cb){
      cb()
    }.bind(this))(this.showName)
  }
}
var person = new Person("person");

person.showName()               // person调用,this指向person
var showName = person.showName;
showName()                      // 相当于window.showName(), window调用,指向window
person.sayName()                // 相当于直接在window下调用cb(), this指向window

第一个setTimeout=>bind(this),这个this当前代表的就是Person这个构造函数,如果没有bind(this)那么setTimeout里面的this指向的就是window,第二个一样的情况,因为(this.showName)里面的this就是person对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题