2011-10-12 22 views
5

Bu demo içinde, (sarma yok) veya (onLoad) kullanırsam farklı çıktılar elde ettim.no wrap (kafa) vs onLoad

Sorumu doğru bir uyarı almak için html dosyasında: 1,2,3,4 kodunda ne tür bir değişiklik gerekiyor? dojoda basit yük ile ben bütün uyarılara daima 4 var: i

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
    var slider = []; 

    for (i = 0; i < 4; i++) { 

     slider[i] = function() { 

      alert([i]); 

     }; 
     dojo.addOnLoad(slider[i]); 
    } 
    </script> 

cevap

3

Bir closure kullanabilirsiniz. Kapatma olmadan, i, orijinal işlevin kapsamına alınır.

+0

Mükemmel adam, teşekkürler – anvd

0

değeri onlar çağrıldığında sizin fonksiyonları görecek ne döngünün, sonunda 4'tür. Böyle bir şey çalışması gerekir:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
var slider = []; 

for (i = 0; i < 4; i++) { 
    eval("slider[i] = function() { alert([" + i + "]);};"); 
    dojo.addOnLoad(slider[i]); 
} 
</script> 

Düzenleme: iyi de işlevleri tanımlandıkları yaparken ziyade denir sayma yapıyor deneyebilirsiniz. Örneğin.

var slider = []; 

for (i = 1; i < 5; i++) { 

    slider[i] = (function (i) { 

     return function() { alert([i]); } 

    })(i); 
    dojo.addOnLoad(slider[i]); 
} 

Bu tasarrufu durumuna başka işlevler kapsam içine i kazandıracak:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
var slider = []; 
var onLoadCounter = 0; 

var onLoadCallback = function() { 
    alert(onLoadCounter); 
    onLoadCounter++; 
}; 

for (i = 0; i < 4; i++) { 
    slider[i] = onLoadCallback; 
    dojo.addOnLoad(slider[i]); 
} 
</script> 
+0

Bu eşsiz bir alternatif mi? Eğer öyleyse, büyük bir değerlendirme alacağım (daha fazla kod var) – anvd

+2

"eval" kullanmayın. Hata ayıklamak için yavaş ve zor. – Quentin