Get to know MDN better
此頁面由社群從英文翻譯而來。了解更多並加入 MDN Web Docs 社群。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
JavaScript 函式內的 this 關鍵字表現,和其他語言相比略有差異。在嚴格模式與非嚴格模式下也有所不同。
通常,this 值由被呼叫的函式來決定。它不能在執行期間被指派,每次函式呼叫調用的值也可能不同。ES5 引入了 bind 方法去設置函式的 this 值,而不管它怎麼被呼叫。ECMAScript 2015 也導入了定義 this 詞法範圍的箭頭函式(它的 this 值會維持在詞法作用域)。
this 值在所有函式以外的全域執行環境下,會被當作全域物件,無論是否處於嚴格模式。
在函式內的 this 值取決於該函式如何被呼叫。
因為以下程式碼並不處於嚴謹模式下、而 this 值也沒被呼叫(call)設定,this 會變成全域物件,在瀏覽器之下則會變成 window。
然而,在嚴格模式下,this 值會在進入執行環境時建立並維持該狀態。因此,下例的 this 預設值是 undefined:
所以在嚴格模式下,如果 this 沒有定義到執行環境內,其預設值就會是 undefined。
備註:在第二個例子裡面,this 應為 undefined,因為 f2 是直接被呼叫,而不是在其為某個物件的方法或屬性的情況下(例如 window.f2())被直接呼叫。某些瀏覽器首次支援嚴格模式時沒導入這個特徵,它們會因此錯誤的回傳 window 物件。
要從某個語境訪問另一個 this 語境的值,請使用 call 或 apply:
當函式內部調用 this 關鍵字時,其值會和所有繼承自 Function.prototype 並使用 call 或 apply 方法呼叫的特定物件綁定。
使用 call 和 apply 時,如果被輸入作為 this 的值不是物件,JavaScript 內建的 ToObject 運算符會試著把被輸入的值轉變為物件。如果被輸入的值是一個原始型別,例如 7或是 'foo',它們會自動被相關的建構方法轉變為物件。因此,原始數值7會轉變成類似用new Number(7)產生的物件,而字串'foo'會轉變成類似用new String('foo')產生的物件。
ECMAScript 5 導入了 Function.prototype.bind。呼叫 f.bind(someObject) 會建立和 f 的主體與作用域相同之新函式;但無論函數怎麼被調用,原始函數的 this 在新函數將永遠與 bind 的第一個參數綁定起來。
在箭頭函式下,this 值保留了其在詞法作用域 的 this 值。在全域程式碼內,則設為全域物件:
備註:如果這參數被傳遞給箭頭函式的 call, bind, apply 調用,該參數會被忽略。你仍然可以將參數預先調用到 call,但第一個參數(thisArg)必須設置為空。
無論以上哪種,foo 的 this 在建立的時候,都會設為原本的樣子(以上面的例子來說,就是全域物件)。這同樣適用於在其他函式內創建的箭頭函式:它們的 this 是設置為外部執行上下文。
以上面的程式碼為例,稱作匿名函數(anonymous function)A 的函數被指定為 obj.bar,它回傳的函數(稱作匿名函數 B)作為箭頭函數而建立。因而,函數 B 的 this 在呼叫時,將永遠設為 obj.bar (函數 A)的 this。呼叫被回傳的函數(函數 B)時,它的 this 將一直是原本的樣子。
再以上面的程式碼為例,函數 B 的 this 被設為函數 A 的 this,而它屬於物件,所以它依然會設為 obj,就算在 this 設為 undefined 或全域物件的呼叫方式下(或在全域執行環境下,上例的任何方法)
如果一個函式是以物件的方法呼叫,它的 this 會設為該呼叫函式的物件。
以下面的程式碼為例,呼叫 o.f() 的時候,函式內的 this 會和 o 物件綁定。
請注意這個行為,不會受函式如何或何處定義所影響。以上面為例,在我們定義 o 時,也定義了行內函式 f 作為構件(member)。不過,我們也能先定義函式,接著讓它附屬到 o.f。這麼做會得出相同的效果:
這表明了 this 只和 f 作為 o 的構件呼叫有所關聯。
同樣的,this 綁定只會受最直接的構件引用(most immediate member reference)所影響。在下面的例子,我們將物件 o.b 的方法 g 作為函式呼叫。在執行的期間,函式內的 this 會參照 o.b。物件是否為 o 的構件無關緊要,最直接的引用才是最緊要的。
相同概念也能套用定義物件原型鏈的方法。如果方法放在物件的原型鏈上,this 會指向方法所呼叫的物件,如同該方法在物件上的樣子。
在這個示例中,分配給變數 p 的物件沒有自己的 f 屬性,p 繼承了 o 的原型。但是查找 f 最終在 o上找到它的成員名為 f 並不重要。查找開始作為 p.f 的引用,所以 this 在函式內部物件的值被當作是p的引用。也就是說,f 作為 p的調用方法以來,它的 this 指的就是 p。這是一個非常有趣的 JavaScript 原型繼承特性。
當函式從 getter 或 setter 被調用的時候,同樣的概念也成立。用作 getter 或 setter 的函式將自己的 this 綁定到從中設置或獲取的物件上。
若函式以建構子的身份呼叫(使用 new 關鍵字) this 會和被建構的新物件綁定。
備註:建構子預設透過 this 回傳該物件的參照,但它其實能回傳其他物件。如果回傳值不是物件的話,就會回傳 this 這個物件。
在上例的 C2,由於物件在建構的時候被呼叫,新的物件 this was bound to simply gets discarded。這也實質上令 this.a = 37; 宣告死亡:不是真的死亡(因為已經執行了),但它在毫無 outside effects 的情況下遭到消滅。
當一個函式用作事件處理器的話,this 值會設在觸發事件的元素(某些瀏覽器如果不用 addEventListener 方法的話,在動態添加監聽器時,就不會遵循這個常規)
當程式碼從行內的 on 事件處理器呼叫的話,this 就會設在監聽器所置的 DOM 元素:
上方的 alert 會秀出 button。但請注意只有外層程式碼的 this 要這樣設定:
在這裡,內部函式的並沒有設立 this,所以它會回傳全域/window 物件(例如在非嚴格模式下,呼叫函數沒設定 this 的預設物件)
| ECMAScript® 2027 Language Specification # sec-this-keyword |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年8月1日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.