Middle
JavaScript'te bağlam değişikliğini nasıl engellersiniz?
sobes.tech yapay zeka
AI'dan gelen yanıt
JavaScript'te bir fonksiyonun yürütme bağlamı (this değeri), çağrı anında dinamik olarak belirlenir. Bu bağlamın tamamen değiştirilmesini engellemek mümkün değildir, ancak çeşitli yollarla kontrol edilebilir veya sabitlenebilir:
-
call,apply,bindmetodları:callveapply, fonksiyonu açıkça belirtilmiş bağlam ve argümanlarla çağırmaya olanak tanır (callayrı argümanlar,applyise dizi olarak).bind, yeni bir bağlı fonksiyon oluşturur ve bu fonksiyonunthisdeğeri, oluşturulma sırasında sabitlenir, sonraki çağrılardan bağımsızdır. Bu, gelecekteki çağrılar için "bağlam değişikliğini" "yasaklamanın" en etkili yoludur.
// bind ile örnek const obj = { value: 42 }; function showValue() { console.log(this.value); } const boundShowValue = showValue.bind(obj); boundShowValue(); // 42 yazdırır boundShowValue.call({ value: 100 }); // Yine 42 yazdırır, bağlam sabitlenmiştir -
Ok fonksiyonları (Arrow Functions):
- Ok fonksiyonlarının kendi
thisdeğeri yoktur. Çevresinden (lexical)this'i tanım anında yakalarlar. - Ok fonksiyonunun bağlamı,
call,applyveyabindkullanılarak değiştirilemez.
// Ok fonksiyon örneği const outerObj = { name: 'Outer' }; class MyClass { constructor() { this.className = 'MyClass'; this.showNameArrow = () => { // `this` burada, yapıcı fonksiyon veya `MyClass`'in tanım alanından yakalanır console.log(this.className); }; } showNameRegular() { // `this` burada, çağrı sırasında belirlenir console.log(this.className); } } const instance = new MyClass(); instance.showNameArrow(); // 'MyClass' yazdırır const anotherObj = { className: 'Another' }; const boundArrow = instance.showNameArrow.bind(anotherObj); // bağlamı değiştirmeye çalışma boundArrow(); // Yine 'MyClass' yazdırır, ok fonksiyonunun bağlamı değiştirilemez instance.showNameRegular.call(anotherObj); // 'Another' yazdırır, normal fonksiyonun bağlamı değişir - Ok fonksiyonlarının kendi
Özetle, "bağlamın değiştirilmesini engellemek" en iyi şekilde sıkı sıkıya bağlama olarak anlaşılır. Bunun için, normal fonksiyonlar için bind kullanılır ve ok fonksiyonlarının doğal lexikal bağlamı tercih edilir. Ok fonksiyonları bu açıdan daha "değişmez" sayılır.