2011-08-23 20 views
6

Bu javascript uyarısını 3 3'lerin yerine 0, 1 ve 2'yi nasıl yapabilirim?Yerel parametrelerle anonim işlevler nasıl yapılır

var vals = [1, 2, 3]; 
for(var i = 0; i < vals.length; i++) 
{ 
    window.setTimeout(function() {alert(i);}, 1000); 
} 

Ben bunu yapar nedenini biliyorum ama anonim işlevine i geçmek nasıl anlamaya olamaz.

cevap

9

Öyle böyle bir kapakta bu sarabilirsiniz:

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    (function(num) { 
     window.setTimeout(function() {alert(vals[num]);}, 1000); 
    })(i); 
} 

Deneyin: http://jsfiddle.net/qgL7h/

+0

Güzel iş. Bazen sayıların 1, 3, 2 sıralarında uyarıldığını fark ettim. (Belki de, Chrome 13'te 5 kez çalıştıran bir tanesi). –

+0

Sipariş önemli değil ve setTimeout sırasına güvenmemelisiniz. ya da setInterval zaten – Tyilo

3
var vals = [1, 2, 3]; 
function makeCallback(i) 
{ 
    return function() {alert(i);}; 
} 
for(var i = 0; i < vals.length; i++) 
{ 
    window.setTimeout(makeCallback(i), 1000); 
} 
+0

BT çalışacaktır ancak geçerli değil sözdizimi 'window.setTimeout' bir işlev başvurusu, değil yürütmek için bir kod gerektirir. – Tyilo

+0

Bir fonksiyona geri dönmeniz bile gerekmiyor, öyle görünüyor - sadece uyarı (i) 'içinde makeCallback – Blazemonger

+1

Bunu deneyin. makeCallback bir işlev referansı döndürür, bu yüzden çalışır. –

0

işleve i geçmesine kesinlikle gerekli değil, bir atanabilir içinde yerel var.

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    (function() { 
     var num = i 
     window.setTimeout(function() {alert(vals[num]);}, 1000); 
    })(); 
} 

Javascript'in düzgün bir şekilde sözcüksel blok değişkenleri olmadığı için "function() {block}()" işlevi gerekliydi. Son sürümleri bu mümkün kılan "let" ekledik:

var vals = [1, 2, 3]; 

for(var i = 0; i < vals.length; i++) { 
    let num = i 
    window.setTimeout(function() {alert(vals[num]);}, 1000); 
} 
İlgili konular