this是JavaScript中的關(guān)鍵字伸头,指向調(diào)用函數(shù)的對(duì)象塘幅。下面分幾種場(chǎng)景分析挺物。
全局函數(shù)內(nèi)
function test(){
alert(this);
}
this指向的是window對(duì)象,所以在這個(gè)方法內(nèi)可以直接訪問到所有的全局變量。
js對(duì)象內(nèi)
var obj = {};
obj.fun = function(){
alert(this);
};
this指向的是obj對(duì)象
構(gòu)造函數(shù)內(nèi)
function test(){
alert(this);
}
var obj = new test();
this指向obj對(duì)象
apply虎敦,call,bind
apply和call都是改變函數(shù)體內(nèi)部this的指向。第一個(gè)參數(shù)都是this指向的對(duì)象驻仅,傳空就是window對(duì)象,第二個(gè)開始參數(shù)只是格式不同登渣。
bind也可以改變函數(shù)體內(nèi)this指針噪服。調(diào)用bind方法會(huì)生成一個(gè)新的函數(shù)。
當(dāng)你希望改變上下文環(huán)境之后并非立即執(zhí)行胜茧,而是回調(diào)執(zhí)行的時(shí)候粘优,使用 bind() 方法。而 apply/call 則會(huì)立即執(zhí)行函數(shù)呻顽。
其他方式
前面提到用bind等方式修改函數(shù)體內(nèi)的this指向雹顺,ES6的語法提供了兩種方式可以達(dá)到同樣的效果
=> 箭頭函數(shù)
箭頭函數(shù)沒有它們自己的 this,箭頭函數(shù)中的 this 值始終來自閉包所在的作用域廊遍。
:: 綁定操作符
::操作符會(huì)將左值和右值(一個(gè)函數(shù))進(jìn)行綁定嬉愧,從而可以達(dá)到修改方法調(diào)用者同時(shí)也是this值的效果。