執(zhí)行上下文的生命周期:
this的指向拔妥,是在函數(shù)被調(diào)用的時候確定的荆萤。即執(zhí)行上下文被創(chuàng)建時確定的舍咖。
在函數(shù)執(zhí)行過程中矩父,this一旦被確定,就不可更改了排霉。
全局對象中的this
全局對象的this指向它本身窍株。
函數(shù)中的this
在一個函數(shù)上下文中,this由調(diào)用者提供攻柠,由調(diào)用函數(shù)的方式來決定球订。
如果調(diào)用者函數(shù),被某一個對象所擁有瑰钮,那么該函數(shù)在調(diào)用時冒滩,內(nèi)部的this指向該對象。如果函數(shù)獨立調(diào)用飞涂,那么該函數(shù)內(nèi)部的this旦部,則指向undefined。
但是在非嚴格模式中较店,當this指向undefined時士八,它會被自動指向全局對象。
當obj在全局聲明時梁呈,無論obj.c在什么地方調(diào)用婚度,這里的this都指向全局對象,而當obj在函數(shù)環(huán)境中聲明時官卡,這個this指向undefined蝗茁,在非嚴格模式下,會自動轉(zhuǎn)向全局對象寻咒。
使用call哮翘,apply顯示指定this
fn并非屬于對象obj的方法,但是通過call毛秘,我們將fn內(nèi)部的this綁定為obj饭寺,因此就可以使用this.a訪問obj的a屬性了阻课。
而call與applay后面的參數(shù),都是向?qū)⒁獔?zhí)行的函數(shù)傳遞參數(shù)艰匙。其中call以一個一個的形式傳遞限煞,apply以數(shù)組的形式傳遞。這是他們唯一的不同员凝。
function fn(num1, num2) {
console.log(this.a + num1 + num2);
}
var obj = {
a: 20
}
fn.call(obj, 100, 10); // 130
fn.apply(obj, [20, 10]); // 50
call/apply擁有了很多有用處的場景:
- 將類數(shù)組對象轉(zhuǎn)換為數(shù)組
- 根據(jù)自己的需要靈活修改this指向
- 實現(xiàn)繼承
- 在向其他執(zhí)行上下文的傳遞中署驻,確保this的指向保持不變
構(gòu)造函數(shù)與原型方法上的this
通過new操作符調(diào)用構(gòu)造函數(shù),會經(jīng)歷以下4個階段健霹。
- 創(chuàng)建一個新的對象旺上;
- 將構(gòu)造函數(shù)的this指向這個新對象;
- 指向構(gòu)造函數(shù)的代碼骤公,為這個對象添加屬性抚官,方法等扬跋;
- 返回新對象阶捆。
當new操作符調(diào)用構(gòu)造函數(shù)時,this其實指向的是這個新創(chuàng)建的對象钦听,最后又將新的對象返回出來洒试,被實例對象接收。因此朴上,這個時候構(gòu)造函數(shù)的this指向了新的實例對象垒棋。