如果直接當作一般的涵式直接的呼叫:
run();
此時function中的this則會指向全域(在瀏覽器為window,在node.js為global)
若將run這個function依附在某個物件底下呼叫:
document.run = run;
document.run();
此時function中的this則會指向依附的物件(run所依附的document這個物件)
同理,若自訂一個物件也是相同的道理:
var a = {
name:”John”,
todo:run
};
a.todo();
此時function中的this則會指向這個自訂物件本身
比較有趣的是,在原型鏈中this指向是以這個function呼叫寫法的物件來決定,例如:
function AAA() {
}
AAA.prototype.run = run;
var a=new AAA();
我們可以透過原型鏈來操作原型方法:
a.run();
這時候的this會指向new AAA()的這個物件實體
但若是明確寫出原型鏈__proto__的話:
a.__proto__.run();
一樣可以呼叫到這個原型方法,但是此時的this則會指向AAA.prototype這個原型物件
結論
JavaScript中this是以執行的時候怎麼呼叫來決定的,因此對於JavaScript的執行過程必須有高度的掌握,就能理解this指向誰了!