秒懂JavaScipt的this

Tommy
2 min readNov 23, 2016

大家都應該知道JavaScript的this存在於任何function中(也包括全域),但是指向的參考有所不同取決於是"怎麼呼叫"function。以下先假設有一個run的function是這樣寫著:

function run() {
console.log(this);
}

如果直接當作一般的涵式直接的呼叫:

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指向誰了!

--

--