Konsep this dalam JavaScript seringkali dianggap sebagai salah satu bagian yang paling membingungkan bagi pengembang. Namun, kuncinya terletak pada satu aturan emas: Nilai this tidak ditentukan saat fungsi ditulis, melainkan saat fungsi tersebut dipanggil (Execution Context).
Mari kita bedah secara mendalam bagaimana this bekerja dalam konteks eksekusi dasar.
1. Apa Itu this?
this adalah sebuah kata kunci khusus (keyword) yang merujuk pada sebuah objek. Objek mana yang dirujuk? Tergantung pada "siapa" yang memanggil fungsi tersebut atau di mana kode tersebut sedang dijalankan.
2. Global Execution Context
Jika Anda menggunakan this di luar fungsi apa pun (di tingkat paling atas kode Anda), maka this merujuk pada Global Object.
-
Di Browser, global object adalah
window. -
Di Node.js, global object adalah
global.
console.log(this); // Di browser, akan muncul objek Window
Jika Anda mendefinisikan variabel secara global (menggunakan var), variabel tersebut akan menjadi properti dari this.
3. Konteks di Dalam Fungsi (Function Context)
Dalam pemanggilan fungsi biasa, nilai this bergantung pada apakah Anda menggunakan Strict Mode atau tidak.
A. Non-Strict Mode
Secara default, jika fungsi dipanggil tanpa objek pemilik, this akan merujuk ke Global Object (window).
function cekThis() { console.log(this);
}
cekThis(); // Output: Window
B. Strict Mode ("use strict";)
Dalam mode ketat, JavaScript tidak mengizinkan "pemaksaan" ke objek global. Jadi, jika fungsi dipanggil tanpa pemilik, this akan bernilai undefined.
"use strict";
function cekThis() { console.log(this);
}
cekThis(); // Output: undefined
4. Method Context (Objek Pemilik)
Saat sebuah fungsi dipanggil sebagai method dari sebuah objek, this akan merujuk pada objek yang memanggilnya. Ini adalah cara paling umum kita menggunakan this.
const user = { nama: "Rian", panggilNama() { console.log(this.nama); }
}; user.panggilNama(); // Output: Rian (this merujuk ke objek 'user')
5. Masalah Kehilangan Konteks (Context Loss)
Salah satu kesalahan umum adalah ketika kita memindahkan method ke variabel lain. Konteks this-nya bisa hilang.
const fungsiPanggil = user.panggilNama;
fungsiPanggil(); // Output: undefined (karena sekarang dipanggil sebagai fungsi biasa, bukan method user)
6. Arrow Functions: Pengecualian Spesial
Arrow functions (=>) tidak memiliki this sendiri. Mereka bersifat Lexical Scope, artinya mereka "meminjam" nilai this dari lingkungan (scope) di mana arrow function itu dibuat.
const bot = { nama: "Robo", halo: () => { console.log(this.nama); }
}; bot.halo(); // Output: undefined (karena 'this' merujuk ke scope luar/global, bukan 'bot')
Ringkasan Aturan this
| Situasi | Nilai this |
| Global Scope | Global Object (window) |
| Fungsi Biasa | Global Object (atau undefined jika strict mode) |
| Method Objek | Objek yang memiliki method tersebut |
| Arrow Function | Mengambil this dari lingkungan luar (lexical) |
Kesimpulan Singkat
Untuk mengetahui nilai this, lihatlah di sebelah kiri tanda titik (.) saat fungsi dipanggil. Jika ada user.panggil(), maka this adalah user. Jika tidak ada titik, kemungkinan besar this adalah global atau undefined.