this綁定的時(shí)機(jī)
- this是在運(yùn)行時(shí)候綁定的,并不是在編寫(xiě)的時(shí)候,它的上下文取決于函數(shù)調(diào)用時(shí)候的各種條件。this的綁定和函數(shù)聲明的位置沒(méi)有任何關(guān)系,只取決于函數(shù)調(diào)用的位置。
this的綁定規(guī)則
-
默認(rèn)綁定
獨(dú)立的函數(shù)調(diào)用,可以把這條規(guī)則看做是無(wú)法應(yīng)用其他規(guī)則的默認(rèn)規(guī)則。function foo(){ console.log(this.a) } var a = 2; foo() //2 // 這里的foo()函數(shù)是直接不帶任何修飾的函數(shù)調(diào)用,因此只能使用默認(rèn)綁定
-
隱式綁定
函數(shù)調(diào)用位置是否有上下文對(duì)象,或者說(shuō)是否被某個(gè)對(duì)象包含。function foo() { console.log(this.a) } var obj = { a: 2, foo:foo } obj.foo() // 2 // 這里的隱私綁定會(huì)把函數(shù)調(diào)用中的this綁定到這個(gè)上下文對(duì)象。
2.1 隱式丟失
一個(gè)常見(jiàn)的問(wèn)題是隱式綁定的函數(shù)會(huì)丟失綁定對(duì)象,也就是說(shuō)會(huì)默認(rèn)應(yīng)用默認(rèn)綁定,這時(shí)候的this
可能會(huì)被綁定到全局上或者是undefined
function foo() { console.log(this.a) } var obj = { a: 2, foo:foo } var bar = obj.foo(); var a = 'global'; bar() // global
這里的bar函數(shù)引用了
obj.foo
,但實(shí)際上引用的是foo函數(shù)本身,因此此時(shí)的bar
函數(shù)其實(shí)是一個(gè)不帶任何修飾的函數(shù)調(diào)用,因此應(yīng)用了默認(rèn)綁定。
參數(shù)傳遞也是一種隱式賦值。傳入的回調(diào)函數(shù)中一般也是隱式丟失,應(yīng)用默認(rèn)綁定。 -
顯式綁定
使用bind
apply
call
等方法簽字改變this
指向,我們稱(chēng)為顯示綁定function foo() { console.log(this.a) } var obj = { a: 2 } foo.call(obj) //2