2011-06-06 14 views
6

Bu küçük pasaj pasajını göz önünde bulundurun:Javascript kapatmalarında nasıl çalışabilirim?

for(var i in map.maps) 
{ 
    buttons.push($("<button>").html(i).click(function() { alert(i); })); 
} 

map.maps nesnesindeki her alan için bir düğme oluşturur (Bu bir assoc dizisidir). İndeksi düğmenin metni olarak ayarlıyorum ve indeksi de uyarmak için ayarladım. Açıkçası, tüm düğmeler tıklatıldığında kendi metnini uyarmasını bekler, ancak tüm düğmeler tıklandığında map.maps nesnesindeki son dizininin metnini uyarır.

Bu davranışın, JavaScript'in kapanışları gerçekleştirme, geri dönme ve oluşturuldukları kapakların işlevlerini yürütme biçimindeki düzgün bir yoldan kaynaklandığını farz ediyorum.

Bunu elde etmeyi hayal edebilmemin tek yolu, dizini düğme nesnesi üzerindeki veri olarak ayarlamak ve tıklama geri bildirimini kullanarak kullanmaktır. Xzx20 nesnesindeki map.maps indislerini de taklit edebilir ve indexOf kullanarak tıklattığımda doğru dizini bulabilirim, ama eski yöntemi tercih ederim.

Cevaplarda aradığım şey, doğru şekilde yaptığımı veya 'ün'ü nasıl yapması gerektiğiyle ilgili bir öneri olduğunun doğrulanmasıdır.

+1

Hemen hemen bir çoğaltması [Bir JS değişkeninin değerini (referans değil) bir işleve nasıl geçirebilirim?] (Http://stackoverflow.com/questions/2568966/how-do-i-pass-the -value-değil-referans-of-a-js-değişken-bir-işlev) –

cevap

9

, çevrelerindeki çalışmaz.

for(var i in map.maps) 
{ 
    (function(i){ 
     buttons.push($("<button>").html(i).click(function() { alert(i); })); 
    })(i); 
} 

Bunu ayrı kapatılmasıyla biter ve değeri o kapatılması için yerel bir var/param tutulur böylece var i kullanan kod kaydırmak gerekir.

Yalnız bir günkü yanıtında olduğu gibi ayrı bir işlev kullanmak bu kapanma davranışını biraz gizler, ancak aynı zamanda daha nettir.

+0

Benim kod (çok az) daha hızlı, çünkü işlev yalnızca bir kez oluşturulur. Bununla birlikte, etki tam olarak aynıdır. – lonesomeday

4

, değer kilitli edilecektir: kapanışları kucaklayın

function createButton(name) { 
    return $("<button>").html(name).click(function() { alert(name); }); 
} 

for (var i in map.maps) { 
    buttons.push(createButton(i)); 
} 
0

Bu yapmaya çalıştığımız şeyi yapmaya en zarif yolu şudur:

var buttons = myCharts.map(function(chart,i) { 
    return $("<button>").html(chart).click(function(event){ 
     alert(chart); 
    }); 
} 

Sen ihtiyaç kapanışları javascript zarif kodlamak ve onlara bir çözüm olmamalıdır. Ya da döngüler için yuvalanmış gibi şeyler yapamazsınız (korkunç bir şekilde hack olmadan). Bir kapatmaya ihtiyacınız olduğunda, bir kapatma kullanın. Fonksiyonların içindeki yeni fonksiyonları tanımlamaktan korkmayın.

1
for(var i in map.maps){ 
    (function(i){ 
     buttons.push($("<button>").html(i).click(function() { alert(i); })) 
    })(i); 
} 

kapatma sizin durumunuzda neden başarısız neden hala işlev Bu durumda olay işleyicisi olduğu yer olan bağlıdır sonra bile güncellenmiş değeri olmasıdır. Bu, kapanışın sadece değişkenlere yapılan referansları hatırladığından ve bağlı olduklarında gerçek değeri değil.

Yürütülen anonim işlevle, i değerini anonim işleve geçirerek elde edilen doğru değeri uygulayabilirsiniz, böylece anonim işlev kapsamı içinde yeniden tanımlanır.