SORU
15 NİSAN 2009, ÇARŞAMBA


İçinde döngüler JavaScript kapatma – basit pratik örnek

Kapaklar üzerinde çok tartışılan şeylerden biridir, ama bu durum benim için çok açılır ve hep kafamı kurcalıyor kaldım.

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

Bu çıkışları:

Benim değeri: 3
Benim değeri: 3
Benim değeri: 3

Çıkış için istiyorum oysa:

Benim değer: 0
Benim değer: 1
Benim değer: 2

Bu temel sorunun çözümü nedir?

CEVAP
15 NİSAN 2009, ÇARŞAMBA


Sorun değişken ben, isimsiz işlevlerin her birinde, işlevi aynı değişken dışarıya bağlı olmasıdır.

Ne yapmak istediğini işlevi dışında ayrı, değişmeyen bir değer için her fonksiyon içinde değişken bağlama

var funcs = [];

function createfunc(i) {
    return function() { console.log("My value: "   i); };
}

for (var i = 0; i < 3; i  ) {
    funcs[i] = createfunc(i);
}

for (var j = 0; j < 3; j  ) {
    funcs[j]();                        // and now let's run each one to see
}

- Sadece fonksiyon kapsamı - yeni bir fonksiyonun oluşturulması sararak JavaScript bloğu kapsamı yok bu yana, "ben sizin istediğiniz gibi." kalıntı değer emin olun


Güncelleme:ile nispeten yaygın kullanılabilirlik Array.prototype.forEach fonksiyon (2015), dikkati çekiyor ki bu durumları kapsayan yineleme öncelikle bir dizi değerleri, .forEach() sağlar temiz, doğal yol almak ayrı bir kapanması için her yineleme. Yani, farz var çeşit dizi içeren değerler (DOM referanslar, nesneler, ne olursa olsun), ve sorun doğar kurma özel aramalar için her öğe, bunu yapabilirsiniz:

var someArray = [ /* whatever */ ];
// ...
someArray.forEach(function(arrayElement) {
  // ... code code code for this one element
  someAsynchronousFunction(arrayElement, function() {
    arrayElement.doSomething();
  });
});

Fikri geri arama fonksiyonu .forEach döngü ile kullanılan her çağrı kendi dosya kapanacak. Parametre işleyicisi geçti dizi öğesi yineleme bu özel adım özgüdür. Eğer bir zaman uyumsuz geri arama için kullanılan eğer, diğer geri yineleme diğer adımları kurulan herhangi biri ile çarpışır olmaz.

Eğer bir WordPress kullanmak çalışma olacak, $.each() işlevi, benzer bir yeteneği verir.

Güncelleme 2: ECMAScript 6 (ES6), JavaScript en yeni sürümü, şimdi birçok dökmeyen tarayıcılar ve arka uç sistemleri uygulanmaya başladı. Ayrıca ES5 için ES6 eski sistemler üzerinde yeni kullanım izin dönüştürmek için Babel gibi transpilers vardır.

ES6 farklı 13*-*tabanlı değişkenler daha kapsamlı let const yeni kelimeler tanıttı. Örneğin, bir döngü ile lettabanlı dizin, her yineleme döngü olacak yeni bir değer i Her bir değerdir kapsamlı döngünün içinde, yani kod işe yaradı gibi bekler. Pek çok kaynak vardır, ama büyük bir bilgi kaynağı olarak 2ality's block-scoping post tavsiye ederim.

for (let i = 0; i < 3; i  ) {
    funcs[i] = function() {
        console.log("My value: "   i);
    };
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfoPuppet

    InfoPuppet

    15 Kasım 2011
  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • SRC RECORDS

    SRC RECORDS

    2 EKİM 2006