在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ this關(guān)鍵字問題

this關(guān)鍵字問題

clipboard.png

如圖,框框中的this為什么會是Person對象而不是windows呢,不是說settimeout函數(shù)的執(zhí)行對象是windows,this都會指代windows,那settimeout中出現(xiàn)的this不應(yīng)該都是windows嗎?
就像為什么下面這個匿名函數(shù)我綁定this,但是并沒有指向person對象,還是打印的XL大寫?只能通過that = this這樣來轉(zhuǎn)換才能改變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
回答
編輯回答
遺莣

https://www.cnblogs.com/hutao...

這篇文章寫的特別詳細

2018年6月11日 20:10
編輯回答
獨白

兩個地方你都是把匿名函數(shù)的this綁定到了person對象上,不同的是第二個地方你是通過callback函數(shù)打印name,你并沒有綁定這個函數(shù)的this所以是指向window對象的name。

2018年1月6日 18:17
編輯回答
愚念

因為你給setTimeout函數(shù)動態(tài)的傳入了一個this,而這個this正好指向的就是person,所以你取name變量的時候當然是先在person里面找name。如果你不給setTimeout函數(shù)動態(tài)的傳入this,那默認this才是指向window。
第二種情況你這樣的的調(diào)用方式相當于是直接在window中調(diào)用了callback,根據(jù)誰調(diào)用指向誰的原則,所以this執(zhí)行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調(diào)用,this指向person
var showName = person.showName;
showName()                      // 相當于window.showName(), window調(diào)用,指向window
person.sayName()                // 相當于直接在window下調(diào)用cb(), this指向window
2017年8月9日 08:12
編輯回答
冷咖啡

第一個setTimeout=>bind(this),這個this當前代表的就是Person這個構(gòu)造函數(shù),如果沒有bind(this)那么setTimeout里面的this指向的就是window,第二個一樣的情況,因為(this.showName)里面的this就是person對象

2017年3月31日 13:15