概念
當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),會(huì)創(chuàng)建一個(gè)活動(dòng)記錄(有時(shí)也稱為執(zhí)行上下文)喻频。這個(gè)記錄會(huì)包含函數(shù)在哪里被調(diào)用(調(diào)用棧)演闭、函數(shù)的調(diào)用方式、傳入的參數(shù)等信息柒巫。this就是這個(gè)記錄的一個(gè)屬性励堡,會(huì)在函數(shù)執(zhí)行的過(guò)程中用到
this的四條調(diào)用規(guī)則:
- 默認(rèn)綁定:在嚴(yán)格模式下綁定到undefined,否則綁定到全局對(duì)象
var a = 1
function foo() {
console.log(this.a)
}
foo() // 1
上例中堡掏,函數(shù)調(diào)用時(shí)應(yīng)用了this的默認(rèn)綁定应结,因此this指向全局變量。
- 隱式綁定:由上下文對(duì)象調(diào)用?綁定到那個(gè)上下文對(duì)象鹅龄。
var a = 3
function foo() {
console.log(this.a)
}
var obj = {
a: 2,
fn: foo
}
obj.fn() // 2
上例中揩慕,函數(shù)foo在被調(diào)用時(shí),調(diào)用位置會(huì)用obj的上下文來(lái)引用函數(shù)扮休,當(dāng)函數(shù)擁有上下文對(duì)象時(shí)迎卤,隱式綁定規(guī)則會(huì)把函數(shù)調(diào)用中的this綁定到這個(gè)上下文對(duì)象,因此玷坠,this指向obj蜗搔。
- 顯式綁定:由call或者apply(或者bind)調(diào)用?綁定到指定的對(duì)象八堡。
var a = 2
function foo() {
console.log(this.a)
}
var obj = {
a: 3
}
foo.call(obj) \\ 3
上例中碍扔,通過(guò)foo.call(...),我們?cè)谡{(diào)用foo時(shí)強(qiáng)制把它的this綁定到obj上秕重。
- new調(diào)用:由new調(diào)用?綁定到新創(chuàng)建的對(duì)象厉膀。
function Foo() {
console.log(this)
}
var fn = new Foo() // Object{constructor: Foo}
上例中溶耘,使用new來(lái)調(diào)用Foo(...)時(shí),我們會(huì)構(gòu)造一個(gè)新對(duì)象并把它綁定到Foo(...)調(diào)用中的this上
this四條規(guī)則的優(yōu)先級(jí):
new調(diào)用 > 顯式調(diào)用 > 隱式調(diào)用 > 默認(rèn)綁定