Javascript的this究竟指向誰,這個問題總是被拿出來討論,今天就來看看this指向的不同情況。
公式: 物件.函式();
函式內的this指向該物件
//範例1
var obj = {
x: 10,
f: functino(){ console.log(this.x); }
}
obj.f(); //由於調用f函式時,點前面物件為obj,故f內的this指向obj所以輸出為20
//範例2
obj.testobj = {
x:30,
f:function(){ console.log(this.x); }
}
obj.testobj.f(); //30
如果調用函式的前方沒有物件,函式的this則指向全域物件。
(在瀏覽器:window物件,node.js:gobal物件)
公式: 函式();
var x = 10;
var f = function(){
console.log(this.x);
};
f(); //10
這兩個方法可以更動this指派的值,且都是呼叫該函式並讓函式的this指向給予call或apply的第一個參數。
公式:
A物件.函式.call(B物件,參數1,參數2,參數3);
A物件.函式.call(B物件,[參數1,參數2,參數3]);
這兩種方法函式的this指向B物件(若B物件為null,則指向全域物件)
var obj = {
x:10;
f:function(){ console.log(this.x); }
}
var obj2 = {
x:20;
}
obj.f.call(obj2); //利用call指派f的this為指向obj2,所以輸出為20
若將函式當作建構式(constructor)來用,則內部的this指向於new所產生之新物件。
公式: new 建構式();
function FoodConstructor () {
this.Item = '牛排'
}
var myFood = new FoodConstructor();
console.log(myFood.Item); //牛排
在立即函式(IIFE)或是非同步事件(setTimeout)大多都會指向全域,如果要調用的是物件本身的話,可以先用一個變數指向this,等到調用後再重新使用它。
function callName() {
console.log('區域', this.name);
var that = this;
setTimeout(function () {
console.log('全域', this.name);
console.log('區域', that.name);
}, 10);
}
var name = '全域阿婆';
var auntie = {
name: '漂亮阿姨',
callName: callName
// 這裡的 function 指向全域的 function,但不重要
}
auntie.callName();