返回課程

在物件字面值中使用「this」

重要性:5

這裡的函式 makeUser 回傳一個物件。

存取其 ref 的結果是什麼?為什麼?

function makeUser() {
  return {
    name: "John",
    ref: this
  };
}

let user = makeUser();

alert( user.ref.name ); // What's the result?

解答:錯誤。

試試看

function makeUser() {
  return {
    name: "John",
    ref: this
  };
}

let user = makeUser();

alert( user.ref.name ); // Error: Cannot read property 'name' of undefined

這是因為設定 this 的規則不會查看物件定義。只有呼叫的時刻才有關係。

這裡 makeUser() 內部的 this 值為 undefined,因為它是以函式呼叫,而不是以「點」語法作為方法呼叫。

this 的值對整個函式而言只有一個,程式碼區塊和物件字面值不會影響它。

因此 ref: this 實際上會採用函式的目前 this

我們可以改寫函式,並回傳具有 undefined 值的相同 this

function makeUser(){
  return this; // this time there's no object literal
}

alert( makeUser().name ); // Error: Cannot read property 'name' of undefined

如你所見,alert( makeUser().name ) 的結果與前一個範例中 alert( user.ref.name ) 的結果相同。

以下是相反的情況

function makeUser() {
  return {
    name: "John",
    ref() {
      return this;
    }
  };
}

let user = makeUser();

alert( user.ref().name ); // John

現在它可以運作,因為 user.ref() 是一個方法。而且 this 的值會設定為點 . 之前的物件。