在講解 this 之前,先來看一段程式碼,觀察它的執行過程
var myName = 'weiwei';
function callName() {};
callName();
我們可以看見在進入 callName()
這段函式時,
會自動產生 this
,此時的 this
是指向全域 window
此時我們在函式中使用 this.myName
來取用全域中的 myName
var myName = 'weiwei';
function callName() {
console.log(this.myName);
};
callName();
我們能看見會回傳全域中的 myName
,
因為此時 this
是指向全域的關係,
所以才會顯示全域中的 myName
,
而今天要來介紹關於 this
的指向
當我們在執行函式時,this
都會自動產生,
它是一個保留字
我們可以在全域或是函式的執行環境中去執行它
今天針對物件的方法調用進行說明
在物件的方法調用中是最常用的,
這邊只須記下兩個重點就能掌握物件的方法調用
var myName = 'weiwei';
function callName() {
console.log(this, this.myName);
};
var family = {
myName: '小明',
callName: callName,
}
family.callName();
此時能看見 this
是指向 family
這個物件,
而 myName
的結果為 小明
,
因此可以了解 this
會指向前面調用它的物件
我們在看一個範例,當我們使用二階以上的物件時,this 的指向會如何
var myName = 'weiwei';
function callName() {
console.log(this, this.myName);
};
var family = {
myName: '小明',
callName: callName,
wei: {
myName: '威威',
callName: callName,
},
};
family.callName();
family.wei.callName();
我們可以看見在呼叫 family
內的函式 callName()
時,
this
是指向 family
這個物件,
而在呼叫 family
的屬性 wei
當中的函式 callName()
時,
this
是指向 wei
這個物件
接著我們來看最後一個範例,我們將 family.callName()
賦予到變數中,看結果如何
var myName = 'weiwei';
function callName() {
console.log(this.myName);
};
var family = {
myName: '小明',
callName: callName,
};
var callName = family.callName;
callName();
會看見結果為 weiwei
,
此時的 this
會指向全域,
因為 callName()
是直接在全域中執行,而不是在物件中執行,
因此 this
就會指向全域,而不會指向物件,
以上就是物件的方法調用中 this
的指向,我們明天見!!