JavaScript this Keyword Nedir?
JavaScript this kavramı temelden: dört bağlam kuralı (global/function/method/new), arrow function farkı, call/apply/bind ile bağlam değiştirme, sık yapılan hatalar ve mülakat tuzakları.
Closetrafi bosalt
this JavaScript'in en cok yanlis anlasilan ozelligi. Mulakatlarda "this nedir?" diye soruldugunda cogu aday ya yanlis cevap verir ya da "bilmiyorum" der. Ama aslinda basit bir kural var: this, fonksiyonun "kim tarafindan cagirildigini" gosterir. Tanimlandigi anda degil, calistirildigi anda belirlenir.
Mulakatlarda this denince akla 4-5 farkli soru gelir: global this nedir, method icinde this, arrow function farki, call/apply/bind, class constructor, setTimeout'ta this neden kaybolur. Bu yazida hepsini temelden, orneklerle, benzetmelerle anlatiyoruz. Once yalin ifadeyle: this bir "kendini tanitma" mekanizmasi — "ben bu objenin parcasiyim" diyen bir isaret.
Benzetme: Garson kim?
this'i bir restoranda garson gibi dusun. Garsonun "bu siparis kime?" sorusuna verdigi cevap, o an kim icin calistigina baglidir. Ayni insan farkli restoranlarda farkli "kime hizmet ediyor?" cevabi verir.
JavaScript'te this de ayni sekilde: bir fonksiyonun this'i, o an kim tarafindan cagirildigina baglidir, nerede tanimlandigina degil. Bir fonksiyonu farkli objelerden cagirirsan, this her seferinde farkli olur.
- Method icinde this = obje (garson kendi lokantasinda calisiyor)
- Global fonksiyonda this = window (garson sahipsiz, genel alanda calisiyor)
- new ile cagirildiginda this = yeni olusan obje (garson yeni bir musteriye hizmet vermeye basliyor)
- call/apply/bind = garsonu zorla baskasinin lokantasinda calistirmak
Dort baglam kurali
JavaScript'te this'in davranisini belirleyen dort temel kural var. Hangi kural devrede, o an nasil cagirildigina bagli.
1) Global baglam
Bir fonksiyon "duzgun" sekilde cagirildiginda (obje uzerinden degil), this window (tarayici) veya global (Node.js) olur. Strict modeda ise undefined olur.
function kim() {
console.log(this);
}
kim(); // window (tarayici)
// veya undefined (strict mode)
"use strict";
function kim2() {
console.log(this);
}
kim2(); // undefined2) Method baglami (obje uzerinden)
Bir fonksiyon bir objenin methodu olarak cagirildiginda, this = o obje olur. En sik karsilasilan ve en sezgisel durum.
const user = {
isim: "Ali",
yas: 25,
tanit() {
return `Ben ${this.isim}, ${this.yas} yasindayim.`;
},
};
user.tanit(); // "Ben Ali, 25 yasindayim."
// this = user objesiobj.method() gordugunde this = obj. method() (obje olmadan) gordugunde this = window. Bu kadar basit. Once noktaya (.) bak, solundaki obje ne ise this odur.
3) Constructor baglami (new ile)
Bir fonksiyon new ile cagirildiginda JavaScript 4 sey yapar: yeni bos obje olusturur, fonksiyonu o objenin this'iyle calistirir, objeyi otomatik doner, eger acikca donuyorsan onu doner.
function Ogrenci(isim, sinif) {
this.isim = isim;
this.sinif = sinif;
}
const ali = new Ogrenci("Ali", "10-A");
console.log(ali.isim); // "Ali"
console.log(ali.sinif); // "10-A"
// this = ali (yeni olusan obje)4) call/apply/bind ile manuel baglam
this'i manuel olarak degistirmek icin uc fonksiyon var. Bunlar Seviye 4'te detayli anlatilacak.
Arrow function: farkli kural (lexical this)
ES6 ile gelen arrow function, dort baglam kuralinin disindadir. Kendi this'ini olusturmaz, tanimlandigi yerdeki this'i miras alir (lexical this). Bu cok onemli ve mulakatlarda sik sorulan bir fark.
Normal function: this kaybolur
Asagidaki ornekte, setTimeout callback'i normal function, this'i kaybeder ve window'a baglanir.
const user = {
isim: "Ali",
selamVer() {
setTimeout(function() {
console.log("Merhaba " + this.isim); // ❌ this = window
}, 100);
},
};
user.selamVer(); // "Merhaba undefined"Arrow function: this korunur
Ayni ornek arrow function ile yazildiginda this, methodun this'ini (yani user) miras alir.
const user = {
isim: "Ali",
selamVer() {
setTimeout(() => {
console.log("Merhaba " + this.isim); // ✅ this = user
}, 100);
},
};
user.selamVer(); // "Merhaba Ali"Arrow function'i obje methodu olarak kullanma. const user = { tanit: () => console.log(this) } — burada this user degil, lexical (dis) this. Callback'lerde kullan, methodlarda normal function kullan.
call, apply, bind — this'i manuel degistir
Bazen bir fonksiyonun this'ini "zorla" degistirmek istersin. Uc yardimci metod var: call, apply, bind. Ucusunde benzer ama kullanim farkli.
.call(thisArg, arg1, arg2, ...)
Fonksiyonu hemen cagirir, this'i ve argumanlari tek tek alir. En yaygin kullanim this'i baglamak.
function tanit(sehir) {
return `${this.isim}, ${sehir} yasamaktadir.`;
}
const user = { isim: "Ali" };
tanit.call(user, "Istanbul");
// "Ali, Istanbul yasamaktadir."
// this = user (call ile baglandi).apply(thisArg, [arg1, arg2])
call ile ayni ama argumanlari dizi olarak alir. Dinamik sayida arguman gondermek icin ideal.
const sayilar = [5, 2, 9, 1, 7];
// Math.max normalde dizi almaz
Math.max.apply(null, sayilar); // 9 (dizi olarak gonderildi)
// ES6+: Math.max(...sayilar).bind(thisArg, arg1, ...)
Fonksiyonu hemen cagirmaz, yeni bir fonksiyon doner. Kalici baglama icin kullanilir (event handler, callback).
class Tiklayici {
constructor() {
this.sayac = 0;
// bind: this'i kalici olarak bagla
this.arttir = this.arttir.bind(this);
}
arttir() {
this.sayac++;
console.log(this.sayac);
}
}
const t = new Tiklayici();
document.querySelector("button").addEventListener("click", t.arttir);
// Tiklama: 1, 2, 3...
// bind sayesinde this kaybolmazKarsilastirma tablosu
| Metot | Cagri | Argumanlar | Kullanim |
|---|---|---|---|
call | Hemen cagirir | Tek tek (a, b, c) | Tek seferlik this baglamasi |
apply | Hemen cagirir | Dizi olarak ([a, b, c]) | Dinamik arguman listesi |
bind | Cagirmaz, doner | Tek tek (a, b, c) | Kalici baglama (event handler) |
Class ve constructor — this kaybolur
ES6 class'lari aslinda constructor function'larin uzerine kurulu sentaks sekeri. Methodlardaki this normal function gibidir: this = instance, AMA methodu baska yere atarsan this'i kaybedersin.
Tipik hata: event handler this'i
Asagidaki ornek klasik mulakat tuzagi: class methodu event listener olarak verilince this'i kaybeder.
class Saya {
constructor() {
this.sayac = 0;
}
arttir() {
this.sayac++;
console.log("Sayac:", this.sayac);
}
}
const s = new Saya();
document.querySelector("button").addEventListener("click", s.arttir);
// ❌ Sayac: NaN (this artik saya degil, button elemani)3 cozum
Cozum 1: constructor'da bind
constructor() {
this.arttir = this.arttir.bind(this);
}Cozum 2: arrow function class field
class Saya {
sayac = 0;
arttir = () => {
this.sayac++;
console.log("Sayac:", this.sayac);
};
}
// this lexically bagli, hic kaybolmazCozum 3: inline arrow callback
btn.addEventListener("click", () => s.arttir());
// arrow function this'i s'den alirSik yapilan hatalar ve tuzaklar
Hata 1: this'i saklamadan nested function
const user = {
isim: "Ali",
arkadaslar: ["Veli", "Ayse"],
goster() {
this.arkadaslar.forEach(function(f) {
// ❌ this = window, user.isim undefined
console.log(this.isim + " arkadasi: " + f);
});
},
};Cozum: forEach'in ikinci argumani olarak this bagla veya arrow function kullan.
// ✅ Cozum A: forEach(thisArg)
this.arkadaslar.forEach(function(f) {
console.log(this.isim + " arkadasi: " + f);
}, this); // forEach'e this'i ver
// ✅ Cozum B: arrow function
this.arkadaslar.forEach((f) => {
console.log(this.isim + " arkadasi: " + f);
});Hata 2: obje method'unu referans olarak vermek
const user = {
isim: "Ali",
selam() { return "Merhaba " + this.isim; }
};
const selamci = user.selam;
selamci(); // ❌ "Merhaba undefined" (this = window)Cozum: bind ile bagla veya user.selam() seklinde obje uzerinden cagir.
const selamci = user.selam.bind(user);
selamci(); // ✅ "Merhaba Ali"Hata 3: arrow method objede
const user = {
isim: "Ali",
selam: () => "Merhaba " + this.isim,
};
user.selam(); // ❌ "Merhaba undefined"
// arrow function lexical this, user degilCozum: Obje methodu olarak normal function kullan, arrow function sadece callback'lerde.
const user = {
isim: "Ali",
selam() { return "Merhaba " + this.isim; },
};
user.selam(); // ✅ "Merhaba Ali"Mulakat SSS
JavaScript'te this nedir, en basit şekilde nasıl açıklanır?
this, fonksiyonun çalıştırıldığı bağlamı (context) temsil eden anahtar kelimedir. 'Kim çağırdı?' sorusunun cevabıdır. Bir method objenin içinde çağrıldıysa this=o obje, global alanda çağrıldıysa this=window, new ile çağrıldıysa this=yeni oluşan obje. this, fonksiyon tanımlandığında değil çağrıldığında belirlenir.
this'in dört bağlam kuralı nedir?
1) Global bağlam: this = window (tarayıcı) veya global (Node). 2) Fonksiyon: normal çağrıda this = window (strict mode'da undefined). 3) Method: obje.method() çağrısında this = obje. 4) new: new Fonksiyon() ile this = yeni oluşan obje. Bu dört kural hangi durumda ne olduğunu belirler. Arrow function ise kendi this'ini oluşturmaz, dışarıdakini miras alır.
call, apply, bind arasındaki fark nedir?
Üçü de this'i manuel olarak değiştirir. call: fonksiyonu hemen çağırır, argümanları tek tek alır. apply: fonksiyonu hemen çağırır, argümanları dizi olarak alır. bind: fonksiyonu hemen çağırmaz, yeni bir fonksiyon döner (sonra çağırırsın). Pratik: call/apply tek seferlik, bind kalıcı bağlama için.
Arrow function'da this nasıl çalışır?
Arrow function kendi this'ini oluşturmaz (lexical this). Tanımlandığı yerdeki dış this'i miras alır. Örneğin bir obje methodu içinde arrow function varsa, o arrow'un this'i methodun this'ine eşittir. Bu yüzden callback'lerde çok kullanışlıdır — normal function'da this'i kaybedersin ama arrow'da korursun.
Mulakat sorusu: 'setTimeout içindeki this neden window oluyor?'
setTimeout(callback, ms) callback'i global scope'ta çalıştırır. Normal function kullanırsan this=window olur. Çözüm 1: arrow function kullan (setTimeout(() => { console.log(this) }, 100) — this dışarıdaki this'i korur). Çözüm 2: bind ile bağla. Çözüm 3: const self = this; self.timeout = setTimeout(function() { console.log(self) }, 100) eski yöntem.
Class içinde this nasıl davranır?
Class methodları normal fonksiyon gibi this bağlamına sahiptir. Yani class.method() çağrısında this=class instance olur AMA methodu başka yere atarsan (örn. setTimeout callback'i olarak), this'i kaybedersin. Modern class'larda sorun: arrow function olarak tanımla (ör. handleClick = () => {}) veya constructor'da bind et.
Bir cümlede özet
this, fonksiyonun "kim tarafından çağrıldığını" gösteren anahtar kelimedir. Dört bağlam kuralı (global/function/method/new) + arrow function lexical this + call/apply/bind ile manuel bağlama. Mulakatlarda en çok sorulan 5 konudan biri.
Modern projelerde class field arrow function veya bind ile this sorunu çözülür. Bu beş yazıyı (closure, hoisting, Promise, async/await, this) bir oturuşta oku — JavaScript mülakatlarının %90'ını geçersin.
İlgili Yazılar
this öğrendin, beşli tamam
JavaScript'in en çok sorulan 5 mülakat konusunu (closure, hoisting, Promise, async/await, this) tamamladın. Sıradaki: prototype, event loop, prototype chain.