2011-05-18 10 views
6

Belki de for döngü endeksi değişkenlerinin kapsamının nasıl olduğunun farkında değilim, ancak döngülerimden biri tamamlanmadığında çok şaşırdım, çünkü bir döngü içinde çağrılan bir işlev, döngü dizini için i içeriyordu iyi. Chrome'da bu çalıştırın ve konsol günlüğüne bakarsakDöngü endeksi değişkenleri için Javascript, global kapsamın bir parçası haline mi geliyor?

var loopOne = function(test) { 
    for(i = 0; i < test.length; i++) 
     console.log(getMask(test)); 
}; 

var getMask = function(pass) {  
    var s = ""; 
    for (i = 0; i < pass.length; i++) { 
     s = s + "*"; 
    } 
    return s;  
}; 

loopOne('hello'); 

, ben ***** beş kez görmelisiniz:

İşte bu davranışı göstermek için bir araya biraz senaryo. Ancak, sadece bir kez görüyorum. Daha fazla denetleme durumunda, Chrome javascript konsoluna i yazdığımda 6 (= 'hello'.length + 1) çıkacaktır. Bu bana i'un global kapsamın bir parçası olduğunu ve bunun gerekli olduğu for döngüsünün kapsamı ile sınırlı olmadığını düşünmemi sağlıyor.

Bu doğru mu? Eğer öyleyse, joker adında bir for döngüsünün endeks değişkenini tanımlamak için daha iyi bir uygulama nedir?

cevap

12

JavaScript yılında değişkenler var anahtar kelimeyle kapsamına eklenir. Değişkenleri var ile bildirirken, değişken geçerli işleve kadar genişletilir. var anahtar kelimesini kullanmadan bir değişkene atandığınızda, aynı veya daha yüksek bir kapsamda önceden tanımlanmış bir değişken hakkında konuştuğunuz varsayılır. Hiçbiri bulunmazsa, değişken en yüksek kapsamda oluşturulur.

Alt satır: tüm değişkenlerinizi var kullanarak bildirin.

+1

"Hiçbiri bulunamazsa, değişken en yüksek kapsamda oluşturulur." Bu sadece kötülük. 'Var' kullanarak kapsam belirleme hakkında açıklama için teşekkürler. Şimdi bahsettiğin, bunu hatırlamalıydım. –

+0

@Ben Gerçekten de, Javascript'in birçok tuzaklarından biridir. AFAIK bu en son ECMAScript spesifikasyonlarında düzeltildi/düzeltildi. – deceze

+0

Sadece "kullanın" sıkı kullanın ". – alex

8

Hep var ile değişkenleri bildirmek olmalıdır:

for(var i = 0; i < test.length; i++) ... 
4

Değişkenlerinizi var ile bildirdiğinizde, bunları geçerli yürütme bağlamına dahil edersiniz.

Bunu yapmadığınızda, genel nesnenin özellikleri olur (bir tarayıcıda window).

İlgili konular