前言
JavaScript 有一套完全不同于其它語言的對 this 的處理機制荣暮。 一般有四種不同的情況下 ,this 指向的各不相同罩驻。但是有一個總的原則穗酥,那就是this指的是,調(diào)用函數(shù)的那個對象惠遏。
一砾跃、函數(shù)調(diào)用
函數(shù)調(diào)用時,this
指向全局對象节吮,如果是在瀏覽器中中抽高,這個對象是window
。
請看下面這段代碼:
var fn = function() {
function test() {
console.log(this);
// this 將會被設置為全局對象(譯者注:瀏覽器環(huán)境中也就是 window 對象)
}
test();
}
fn() //執(zhí)行函數(shù)fn透绩,結果指向window
二翘骂、方法調(diào)用
當函數(shù)作為對象的方法
時壁熄,this指向該對象
請看下面這段代碼:
var age = 10;
var xiaoming = {};
xiaoming.age = 18;
xiaoming.getAge = function(){
console.log(this.age);
}
xiaoming.getAge(); //18
之所以為18不是10,因為this指向xiaoming這個對象碳竟,所以打印出來是18
三草丧、調(diào)用構造函數(shù)
如果函數(shù)傾向于和 new
關鍵詞一塊使用,則我們稱這個函數(shù)是 構造函數(shù)莹桅。 在函數(shù)內(nèi)部昌执,this
指向新創(chuàng)建的對象。
請看下面這段代碼:
var x = 0;
function test(){
this.x = 1;
}
var obj = new test();
console.log(obj.x); // 1
打印出來為1不為0统翩,表明this指向新對象obj,而不是全局對象此洲。
四厂汗、顯式的設置 this (apply和call)
當使用 Function.prototype 上的 call
或者 apply
方法時,函數(shù)內(nèi)的 this
將會被 顯式設置為函數(shù)調(diào)用的第一個參數(shù).
當?shù)谝粎?shù)為null
或者 undefined
呜师,在瀏覽器環(huán)境里那么window對象就是默認的this指向娶桦。
var age = 0;
var xiaoming = {};
function setAge(age){this.age = age;}
xiaoming.age = 18;
xiaoming.setAge = setAge;
xiaoming.setAge.apply(null,[20]);
xiaoming.age // 18
age // 20
xiaoming.setAge.call(xiaoming,25);
xiaoming.age // 25
age // 20
apply和call區(qū)別在于傳遞參數(shù)格式不同,call()接受一個參數(shù)列表汁汗,而apply()接受包含多個參數(shù)的數(shù)組(或類數(shù)組對象)
文筆有限衷畦,才疏學淺,文中若有不對之處知牌,還望告知祈争。
參考文章