Döngülerdeki JavaScript Kapanışlarını Anlamak: Pratik Örnekler

JavaScript

JavaScript'te Döngü Kapanışlarını Çözmek

JavaScript geliştiricileri döngülerin içindeki kapanışları kullanırken sıklıkla beklenmedik davranışlarla karşılaşırlar. Bu sorun özellikle kapanış kavramına yeni başlayanlar için kafa karışıklığına yol açabilir.

Bu makalede, sık rastlanan tuzakları gösteren pratik örnekleri inceleyeceğiz ve ister olay dinleyicileriyle, ister eşzamansız kodla, ister diziler üzerinde yinelemeyle uğraşırken olsun, döngülerdeki kapanışları etkili bir şekilde kullanmak için çözümler sunacağız.

Emretmek Tanım
let İsteğe bağlı olarak onu bir değere başlatarak, blok kapsamlı bir yerel değişken bildirir. Döngünün her yinelemesinin kendi kapsamına sahip olmasını sağlamak için kullanılır.
const Blok kapsamlı, salt okunur bir adlandırılmış sabit bildirir. Değerinin değişmemesi gereken bir işlev veya değişken oluşturmak için kullanılır.
Promise Zaman uyumsuz bir işlemin nihai tamamlanmasını (veya başarısızlığını) ve bunun sonuç değerini temsil eder.
setTimeout Belirtilen sayıda milisaniyeden sonra bir işlevi çağırır veya bir ifadeyi değerlendirir.
addEventListener Mevcut olay işleyicilerinin üzerine yazmadan, belirli bir öğeye bir olay işleyicisini ekler.
IIFE Hemen Çağrılan Fonksiyon İfadesi. Tanımlandığı anda çalışan bir fonksiyon. Döngülerde yerel kapsamlar oluşturmak için kullanılır.
for...in Bir nesnenin numaralandırılabilir özelliklerini rastgele bir sırayla yineler.
for...of Yinelenebilir bir nesnenin (bir dizi veya dize gibi) değerleri üzerinde belirli bir sırayla yinelenir.

Döngülerdeki JavaScript Kapanışlarını Anlamak

Önceki örneklerde verilen komut dosyaları, JavaScript'teki döngülerdeki kapanmalarla ilgili yaygın soruna değinmektedir. Bir kullanırken Bir döngü içindeki bildirimde tüm yinelemeler aynı işlev kapsamını paylaşır. Bu nedenle ilk örnekte çıktı üç kez "Değerim: 3" olur. Çözüm kullanmaktır her yineleme için doğru değeri koruyan bir blok kapsamı oluşturur. Bu yaklaşım, her yinelemenin kendi kapsamına sahip olmasını sağlar, böylece işlev çağrıldığında doğru değer korunur. Komut dosyası, bildirimin nasıl değiştirildiğini gösterir ile let sorunu düzeltir ve "Değerim: 0", "Değerim: 1" ve "Değerim: 2"yi amaçlandığı gibi günlüğe kaydeder.

Eşzamansız kod için aynı kapatma sorunu ortaya çıkabilir. Kullanma Ve ile işlevler her asenkron çağrının doğru yineleme değerini korumasını sağlar. Komut dosyası bunu kullanarak şunu gösterir: wait ile , çözümlenen her söz beklenen değeri günlüğe kaydeder. Etkinlik dinleyicileri de benzer sorunlarla karşılaşabilir; ancak dinleyici işlevini bir (Hemen Çağrılan İşlev İfadesi), her yineleme için yeni bir kapsam oluşturarak doğru değerin yakalanmasına yardımcı olur. Kullanımı Ve for...of döngüler ayrıca kapanışlarda kapsam belirlemenin önemini ortaya koyarak dizin ve değerin nasıl doğru şekilde yakalanacağını gösterir. Her döngü yinelemesi için farklı kapsamlar oluşturmak.

Let ile JavaScript Döngülerindeki Kapanış Sorunlarını Çözme

JavaScript (ES6)

let funcs = [];
// Let's create 3 functions
for (let i = 0; i < 3; i++) {
  // and store them in funcs
  funcs[i] = function() {
    // each should log its value.
    console.log("My value:", i);
  };
}
for (let j = 0; j < 3; j++) {
  // and now let's run each one to see
  funcs[j]();
}

Asenkron Kodda Doğru Kapanış Değerlerinin Sağlanması

JavaScript (ES6)

const wait = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms));
for (let i = 0; i < 3; i++) {
  // Log `i` as soon as each promise resolves.
  wait(i * 100).then(() => console.log(i));
}

IIFE Kullanan Olay Dinleyicilerinde Doğru Kapanış

JavaScript (ES6)

var buttons = document.getElementsByTagName("button");
// Let's create 3 functions
for (var i = 0; i < buttons.length; i++) {
  // as event listeners
  (function(i) {
    buttons[i].addEventListener("click", function() {
      // each should log its value.
      console.log("My value:", i);
    });
  })(i);
}

For...in ve for...of Döngüleriyle Doğru Kapanış

JavaScript (ES6)

const arr = [1, 2, 3];
const fns = [];
for (const i in arr) {
  fns.push(((i) => () => console.log("index:", i))(i));
}
for (const v of arr) {
  fns.push(((v) => () => console.log("value:", v))(v));
}
for (const n of arr) {
  const obj = { number: n };
  fns.push(((n, obj) => () => console.log("n:", n, "|", "obj:", JSON.stringify(obj)))(n, obj));
}
for (const f of fns) {
  f();
}

Gelişmiş JavaScript İşlevlerinde Kapanışların Kullanımını Keşfetmek

Kapanışlar, JavaScript'te bir fonksiyonun, kapsam kapatıldıktan sonra bile kapsam dahilindeki değişkenlere erişmesine izin veren temel bir kavramdır. Bu özellik özellikle not alma, körleme ve işlevsel programlamada kullanılanlar gibi gelişmiş işlevler oluştururken güçlüdür. Örneğin notlandırma, pahalı işlev çağrılarının sonuçlarını hatırlamak ve aynı girişler tekrar oluştuğunda önbelleğe alınan sonucu döndürmek için kapatmalardan yararlanır. Kapanışları kullanarak, özellikle Fibonacci dizilerini hesaplamak gibi özyinelemeli işlevlerde performansı artıran daha verimli ve optimize edilmiş kodlar oluşturabiliriz.

Kapamaların bir diğer gelişmiş kullanımı, JavaScript nesneleri içinde özel değişkenler ve işlevler oluşturmak, özel yöntemleri ve özellikleri simüle etmektir. Bu teknik, işlevselliği kapsüllemek ve küresel kapsamı kirletmekten kaçınmak için genellikle modül modellerinde ve hemen çağrılan işlev ifadelerinde (IIFE) kullanılır. Dahası, kapanışlar olay işlemede ve eşzamansız programlamada çok önemli bir rol oynar ve zaman içinde durum ve bağlamın korunmasına yardımcı olurlar. Kapanışları anlamak ve etkili bir şekilde kullanmak, JavaScript programlama becerilerinizi önemli ölçüde geliştirebilir ve daha modüler, yeniden kullanılabilir ve bakımı yapılabilir kod yazmanıza olanak tanır.

  1. JavaScript'te kapatma nedir?
  2. Kapatma, işlev kapsamı dışında yürütüldüğünde bile sözcüksel kapsamına erişimi koruyan bir işlevdir.
  3. Kapanışlar neden döngülerde meydana geliyor?
  4. Döngülerde kapanmalar, döngünün aynı değişken referansını yakalayan işlevler oluşturması ve doğru şekilde işlenmezse beklenmeyen davranışlara yol açması nedeniyle oluşur.
  5. Döngülerdeki kapanma sorunlarını nasıl çözebiliriz?
  6. Kullanma yerine döngülerde veya kullanarak (Hemen Çağrılan İşlev İfadeleri), her yineleme için yeni bir kapsam oluşturarak kapatma sorunlarını çözebilir.
  7. IIFE nedir?
  8. Bir oluşturulduktan hemen sonra çalıştırılan, genellikle yeni bir kapsam oluşturmak ve değişken çakışmalarını önlemek için kullanılan bir işlevdir.
  9. Eşzamansız programlamada kapanışlar kullanılabilir mi?
  10. Evet, eşzamansız programlamada sözler ve geri aramalar gibi eşzamansız işlemlerde durumu ve bağlamı korumak için kapatmalar önemlidir.
  11. Not alma nedir ve kapanışların nasıl faydası olur?
  12. Notlandırma, pahalı işlev çağrılarının sonuçlarını önbelleğe almak için kullanılan bir optimizasyon tekniğidir. Kapatmalar, birden fazla işlev çağrısında önbelleğe erişimi koruyarak yardımcı olur.
  13. Kapanışlar olay yönetimine nasıl yardımcı olur?
  14. Kapanışlar, olay işleyicilerinin ihtiyaç duyduğu değişkenlerin durumunu koruyarak, olay tetiklendiğinde bunların doğru şekilde çalışmasını sağlar.
  15. JavaScript'teki modül modeli nedir?
  16. Modül modeli, özel değişkenler ve işlevler oluşturmak, işlevselliği kapsüllemek ve küresel kapsam kirliliğini önlemek için kapatmaları kullanır.
  17. Kapanışlar JavaScript'teki özel yöntemleri simüle edebilir mi?
  18. Evet, kapanışlar, değişkenleri ve işlevleri yalnızca tanımlandıkları işlevin kapsamı içinde erişilebilir tutarak özel yöntemleri simüle edebilir.

JavaScript'te, özellikle döngüler içindeki kapanışlarda uzmanlaşmak, öngörülebilir ve verimli kod yazmak için çok önemlidir. Kaldıraç gücüyle , , Ve sayesinde geliştiriciler sık ​​karşılaşılan tuzaklardan kaçınabilir ve değişken kapsamının doğru olmasını sağlayabilir. Bu anlayış, eşzamansız görevleri ve olaya dayalı programlamayı yönetme yeteneğini geliştirerek sonuçta daha sağlam uygulamalara yol açar.