İç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
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 let
tabanlı 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);
};
}
JavaScript içinde bir dizi belirli bir...
JavaScript, basit bir beşgen kullanmak...
JavaScript içinde geçerli URL almak?...
JavaScript içinde Tek veya Çift Tırnak...
JavaScript içinde en fazla 2 ondalık y...