返回課程

解釋「this」的值

重要性:3

在以下程式碼中,我們打算連續呼叫 obj.go() 方法 4 次。

但呼叫 (1)(2)(3)(4) 的運作方式不同。為什麼?

let obj, method;

obj = {
  go: function() { alert(this); }
};

obj.go();               // (1) [object Object]

(obj.go)();             // (2) [object Object]

(method = obj.go)();    // (3) undefined

(obj.go || obj.stop)(); // (4) undefined

以下是說明。

  1. 這是一個常規物件方法呼叫。

  2. 相同,括號不會變更運算順序,無論如何,點才是第一個。

  3. 這裡我們有一個更複雜的呼叫 (expression)()。呼叫運作方式就像將其拆分成兩行

    f = obj.go; // calculate the expression
    f();        // call what we have

    這裡 f() 以函式執行,沒有 this

  4. (3) 相似,在括號 () 的左側,我們有一個表達式。

要說明 (3)(4) 的行為,我們需要回想屬性存取器(點或方括號)會傳回參考類型的值。

除了方法呼叫(例如指定 =||)以外,對其執行的任何運算都會將其轉換為一般值,而不會傳遞允許設定 this 的資訊。