2011-05-18 168 views
6

也許我不知道for循環索引變量是如何得到作用域的,但是當我的一個循環沒有完成時,我感到非常驚訝,這似乎是因爲從循環中調用的函數包含i,因爲它的for循環索引與好。循環索引變量的Javascript成爲全局範圍的一部分?

這裏有一個小劇本我放在一起演示此行爲:

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'); 

如果我跑這在Chrome中,並期待在控制檯日誌,我應該看到*****五倍。但是,我只看到它一次。經過進一步檢查,如果我在Chrome瀏覽器控制檯輸入i,它將輸出6(= 'hello'.length + 1)。這使我認爲i已成爲全球範圍的一部分,並不侷限於需要它的for循環的範圍。

這是正確的嗎?如果是這樣,在javascript中定義for循環的索引變量有什麼更好的做法?

回答

12

在Javascript中,變量與var關鍵字作用域。當用var聲明變量時,該變量的作用域爲當前函數。如果在不使用關鍵字var的情況下分配給變量,則假定您正在討論在相同或更高範圍內的已定義變量。如果沒有找到,則該變量在最高範圍內創建。

底線:使用var聲明所有變量。

+1

「如果找不到,則該變量在最高範圍內創建。」這只是邪惡。感謝使用'var'的範圍解釋。現在你提到它,我應該記住這一點。 – 2011-05-18 01:39:12

+0

@Ben事實上,這是Javascript的許多缺陷之一。 AFAIK這是正在/被糾正在最新的ECMAScript規範。 – deceze 2011-05-18 01:40:13

+0

我想只有當你加上''use strict'''。 – alex 2011-05-18 01:55:08

8

你應該總是與var聲明變量:

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

當您使用var聲明變量時,將其範圍限定在當前執行上下文中。

如果不這樣做,它們將成爲全局對象的屬性(在瀏覽器中爲window)。