JS中, this的值到底是什么?
幾個月之前, 拜讀了《javascript語言精髓》, 里面對于這個問題, 做出了很好的解釋...
JS中, this的值取決于調(diào)用的模式, 而JS中共有4中調(diào)用模式:
1. 方法調(diào)用模式
當一個函數(shù)被保存為對象的一個屬性時, 我們稱它為一個方法, 當一個方法被調(diào)用時, this指向該對象, 如:
var obj = {
value: 1,
getValue: function() {
alert(this.value);
}
};
obj.getValue(); // 輸出1, 此時的this指向obj
注意: 該模式中, this到對象的綁定發(fā)生在方法被調(diào)用的時候.
注意:如果方法里面有閉包:那么閉包里面的this值已經(jīng)不指向調(diào)用方法的對象了,指向全局對象
var myObject = { num: 2, add: function () { this.num = 3; (function () { alert(this.num); //underfined this.num = 4; })(); alert(this.num) //3 } }
myObject.add();
2. 函數(shù)調(diào)用模式
當一個函數(shù)并非一個對象的屬性時, 它被當作一個函數(shù)來調(diào)用, 此時的this指向全局對象(window), 如:
window.value = 1;
function getValue() { alert(this.value); }
getValue(); // 輸出1, 此時的this指向window.
3. 構(gòu)造器調(diào)用模式
結(jié)合new前綴調(diào)用的函數(shù)被稱為構(gòu)造器函數(shù), 此時的this指向該構(gòu)造器函數(shù)的實例對象, 如:
function show(val) {
this.value = val;
};
show.prototype.getVal = function() {
alert(this.value);
};
var func = new show(1);
func.getVal(); // 輸出1
alert(func.value) // 輸出1
// 從上面的結(jié)果, 可以看出, 此時的this指向了func對象.
4. apply/call調(diào)用模式
apply和call方法可以讓我們設定調(diào)用者中的this指向誰, 如:
var fun = function(str) {
this.status = str;
}
fun.prototype.getStatus = function() {
alert(this.status);
}
var obj = {
status: "loading"
};
fun.prototype.getStatus.apply(obj); // 輸出"loading", 此時getStatus方法中的this指向了obj