JS 底層觀念 - this 物件 上(定義&基礎例子)
透過清楚的範例與逐步說明,帶你認識 JavaScript 中的 this 關鍵字。了解 this 的定義、預設綁定、隱式綁定與常見錯誤,建立堅實的 JS 底層觀念基礎。
2025/06/24
🔍 this 是什麼?
- this 是 JavaScript 的一個關鍵字。
- 它是 function 執行時自動產生的一個內部物件。
- this 的值會依據 函式的執行方式 而改變。
- 大多數情況下,this 代表「呼叫該函式的物件」。
📦 基礎範例
var age = 15; function getAge() { return this.age; } const people1 = { age: 25, getAge: getAge }; const people2 = { age: 18, getAge: getAge }; console.log(people1.getAge()); // 25 ✅ console.log(people2.getAge()); // 18 ✅ console.log(getAge()); // 15 (或 undefined) ❗
people1.getAge() 時,this 是 people1。
getAge() 直接呼叫時 → this 是 window(瀏覽器環境)或 global(Node.js server環境)。
所以最後一行會回傳 window.age = 15,但若在 "use strict" 模式下,會變成 undefined。
若函式沒有被任何物件呼叫(前面沒有 obj.
),this 預設就會指向 window。這種綁定方式叫做「預設綁定(Default Binding)」。
瀏覽器中的 window 是什麼?
window 是瀏覽器的全域物件,擁有:
- document
- localStoarge
- console
- ...等全域API
🎯 練習範例解析
var foo = function() { this.count++; }; foo.count = 0; for( var i = 0; i < 5; i++ ) { foo(); } console.log(foo.count)
this.count++ 操作的是 window.count
,並不影響 foo.count
。所以結果仍為 0。
var bar = function() { console.log( this.a ); }; var foo = function() { var a = 123; this.bar(); }; foo();
輸出 undefined
。
foo
內 this
為 window
,呼叫 window.bar()
bar
內this
為window
,window.a
未定義
var foo = 'foo'; var obj = { foo: 'foo in Object' }; var sayFoo = function() { console.log( this.foo ); }; obj.sayFoo = sayFoo; obj.sayFoo(); // foo in Object sayFoo(); // foo
🧭 巢狀作用域中的 this :
var a = 1 var obj = { var a = 2 fn1: function(){ console.log(this.a); // 2 ✅ var fn2 = function(){ var a = 3 console.log(this.a); // 1 ❗ }; fn2(); } }; obj.fn1()
fn2 是直接呼叫的,this
指向 window
,所以印出 1。
🎯 如何快速判斷 this?
✅ 判斷是否有 . 呼叫:
- obj.fn() → this = obj(隱式綁定)
- fn() → this = window(預設綁定)
📚 this 的 5 種綁定方式
類型 | 專有名詞(Binding Type) | 綁定邏輯說明 | 範例 |
---|---|---|---|
1️⃣ 預設綁定 | Default Binding | 函式直接呼叫 → this = window / global | sayHi() |
2️⃣ 隱式綁定 | Implicit Binding | 被物件呼叫 → this = 該物件 | obj.sayHi() |
3️⃣ 顯式綁定 | Explicit Binding | call / apply / bind 明確設定 this | sayHi.call(obj) |
4️⃣ new 綁定 | New Binding | 建構函式內 → this 是新創建的物件 | new Person() |
5️⃣ 箭頭綁定 | Lexical Binding | 箭頭函式固定綁定「定義當下」的作用域 | () => this.name |
✅ 小結
this 的值不是固定的,而是根據函式被「如何呼叫」來決定的。
最容易搞錯的是 預設綁定 和 隱式綁定,本篇已完整介紹。
要預測 this,只需要問自己:是誰在呼叫這個函式?
🔜 下一篇將介紹:
call / apply / bind 的使用方式(顯式綁定)
new 關鍵字如何改變 this
為什麼箭頭函式不會有自己的 this?
留言區
SB
26 天前document.alert("XSS");
發表留言