默認(rèn)綁定:
當(dāng)直接調(diào)用一個(gè)函數(shù)的時(shí)候 , 就是默認(rèn)綁定
1 . 非嚴(yán)格模式下,默認(rèn)綁定到 window上
2 . 嚴(yán)格模式下,沒有綁定,返回 undefinde
隱式綁定:
當(dāng)使用 對象.方法( ) 這種調(diào)用方式 , 稱之為隱式綁定
this就綁定在調(diào)用的對象上
var name = "張三"
var obj = {
name : "李四",
foo : function () {
console.log(this.name);
}
}
var foo = obj.foo;
foo()
//輸出張三
//誰調(diào)用指向誰(嚴(yán)格模式下會(huì)報(bào)錯(cuò),因?yàn)閲?yán)格模式下沒有默認(rèn)綁定)
new綁定:
使用new來調(diào)用構(gòu)造函數(shù)的方式,this是綁定在新創(chuàng)建的那個(gè)對象上
在混合綁定中 , new優(yōu)先級高
顯示綁定
call , apply
僅僅這一次調(diào)用的時(shí)候使用了顯示綁定, 對原函數(shù)沒有任何的影響;
call和apply的區(qū)別就是參數(shù)傳遞的方式 :
call的參數(shù)是一個(gè)個(gè)傳遞參數(shù)
function foo(a, b) {
console.log(this.name, a, b);
}
foo.call({name: "張三"}, a, b);
apply是把函數(shù)封裝到一個(gè)數(shù)組中去傳遞
function foo(a, b) {
console.log(this.name, a, b);
}
//foo.call({name: "張三"}, a, b);
foo.apply({name:"張三"},[a,b])
String.prototype.toString.call() 顯示內(nèi)置類型
bind :固定綁定
調(diào)用函數(shù)對象的bind方法,就可以返回一個(gè)固定this綁定的新的函數(shù)
對原來的函數(shù)沒有影響
var obj = {name:"張三"}
function foo() {
console.log(this.name);
}
var f = foo.bind(obj)
var obj2 = {
name : "李四",
foo : f
}
obj2.foo()
//輸出結(jié)果給obj中的張三
優(yōu)先級:固定綁定 -> 顯示綁定 > new綁定 > 隱式綁定
回調(diào)函數(shù)的this綁定丟失問題
var name = "張三"
var obj = {
name : "李四",
show : function () {
setInterval(function () {
console.log(this.name)
},1000)
}
}
obj.show()
#返回張三
解決方案1:
var name = "張三"
var obj = {
name : "李四",
show : function () {
var that = this;
setInterval(function () {
console.log(that.name)
},1000)
}
}
obj.show()
解決方案2:
var name = "張三"
var obj = {
name : "李四",
show : function () {
setInterval(function () {
console.log(this.name)
}.bind(this),1000)
}
}
obj.show()
顯示綁定的丟失問題:
顯示綁定到undefined和null上面的時(shí)候,會(huì)自動(dòng)綁定當(dāng)window上