JavaScript this
sering menyebabkan kekeliruan, terutamanya bagi pembangun yang datang daripada bahasa seperti C#, Java atau Python di mana self
secara konsisten merujuk kepada contoh objek semasa. Tidak seperti bahasa tersebut, JavaScript this
adalah dinamik, nilainya ditentukan oleh konteks pemanggilan fungsi. Panduan ini meringkaskan pelbagai senario yang mempengaruhi tingkah laku this
.
1. Skop Global:
this
menunjuk ke objek global (window
dalam penyemak imbas, global
dalam Node.js).<code class="language-javascript">console.log(this); // window or global</code>
this
ialah undefined
.<code class="language-javascript">"use strict"; console.log(this); // undefined</code>
2. Fungsi Dalaman:
this
merujuk kepada objek global; dalam mod ketat, ia undefined
.<code class="language-javascript">function myFunc() { console.log(this); } myFunc(); // window (non-strict), undefined (strict)</code>
3. Kaedah Objek:
this
merujuk kepada objek itu.<code class="language-javascript">const myObj = { name: "JavaScript", greet() { console.log(this.name); // this refers to myObj } }; myObj.greet(); // Output: JavaScript</code>
4. Fungsi Anak Panah:
this
. Mereka mewarisi this
daripada skop leksikal mereka (konteks sekeliling).<code class="language-javascript">const myObj = { name: "JavaScript", arrowFunc: () => { console.log(this.name); // Inherits this from the global scope } }; myObj.arrowFunc(); // undefined (in browsers, this is window)</code>
5. Pembina:
this
merujuk kepada tika yang baru dibuat.<code class="language-javascript">class Person { constructor(name) { this.name = name; } greet() { console.log(`Hello, ${this.name}`); } } const person = new Person("Alice"); person.greet(); // Output: Hello, Alice</code>
6. Pengikatan Eksplisit (call
, apply
, bind
):
Fungsi JavaScript ialah objek dengan kaedah (call
, apply
, bind
) untuk menetapkan this
secara eksplisit.
call
dan apply
menggunakan fungsi dengan nilai this
yang ditentukan. call
menggunakan hujah yang dipisahkan koma; apply
mengambil tatasusunan.<code class="language-javascript">function greet(greeting) { console.log(`${greeting}, ${this.name}`); } const user = { name: "Alice" }; greet.call(user, "Hello"); // Output: Hello, Alice greet.apply(user, ["Hi"]); // Output: Hi, Alice</code>
bind
mengembalikan fungsi baharu dengan this
terikat secara kekal.<code class="language-javascript">const boundGreet = greet.bind(user); boundGreet("Hello"); // Output: Hello, Alice</code>
7. Pendengar Acara:
this
merujuk kepada elemen yang mencetuskan acara.<code class="language-javascript">const btn = document.querySelector("button"); btn.addEventListener("click", function() { console.log(this); // The button element });</code>
this
mewarisi daripada skop sekeliling, bukan elemen.<code class="language-javascript">btn.addEventListener("click", () => { console.log(this); // this depends on the arrow function's definition context });</code>
8. setTimeout
/ setInterval
:
this
lalai kepada objek global.<code class="language-javascript">setTimeout(function() { console.log(this); // window in browsers }, 1000);</code>
this
diwarisi secara leksikal.<code class="language-javascript">setTimeout(() => { console.log(this); // Inherits this from surrounding context }, 1000);</code>
9. Kelas:
this
merujuk kepada tika kelas.<code class="language-javascript">console.log(this); // window or global</code>
10. Kehilangan Konteks (Kaedah Pengekstrakan):
Menetapkan kaedah kepada pembolehubah atau menghantarnya sebagai panggilan balik boleh menyebabkan kehilangan pengikat this
.
<code class="language-javascript">"use strict"; console.log(this); // undefined</code>
Penyelesaian: Gunakan .bind(obj)
atau fungsi anak panah untuk mengekalkan konteks.
11. new
Kata kunci:
Menggunakan new
dengan fungsi mencipta objek baharu dan this
merujuk kepada objek itu.
<code class="language-javascript">function myFunc() { console.log(this); } myFunc(); // window (non-strict), undefined (strict)</code>
Jadual Ringkasan:
Context |
this Refers To |
---|---|
Global (non-strict) | Global object (window/global) |
Global (strict) | undefined |
Object Method | The object owning the method |
Arrow Function | Lexical scope (surrounding context) |
Constructor/Class | The instance being created |
call , apply , bind
|
Explicitly defined value |
Event Listener | The element triggering the event |
setTimeout /setInterval
|
Global object (regular function), lexical scope (arrow function) |
new Keyword |
The newly created object |
undefined
panggil
, apply
, bind
setTimeout
/setInterval
Kata kunci
this
Memahami senario ini adalah penting untuk menulis kod JavaScript yang betul dan boleh diramal. Ingatlah untuk menggunakan teknik seperti pengikatan eksplisit apabila perlu untuk mengelakkan tingkah laku yang tidak dijangka.Atas ialah kandungan terperinci Mengapa this' dalam JavaScript Berbeza daripada Bahasa OOP Lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!