2012-02-21 22 views
2

我看到在JavaScript製作 「for循環」 的時候,宣佈兩個變量型動物的方法:在JavaScript中創建循環時,我必須在哪裏聲明變量?

第一種方式:

for (var i = 0, l = [].length; i < l; i += 1) { 
    // make something 
} 

方式二:

var i; 
var l; 
for (i = 0, l = [].length; i < l; i += 1) { 
    // make something 
} 

有一些理由,更喜歡其中之一?

回答

2

他們是一樣的,你可以使用,但首先是更可讀和簡潔。

問題是,兩種情況下的變量都是局部的,存在var關鍵字。與第一種方法還,創建兩個局部變量:

var i, l 

而不是

var i 
var l 

爲什麼一次又一次地使用var關鍵字時,只有一個能做到這一點。事實上,原來是JS的良好實踐之一。

2

鑑於您顯示的代碼,它們是相同的。但是,JS有一些奇怪的地方可能會導致更復雜的代碼出現問題。另外,未來的開發人員還有一個可維護性和可讀性的問題。有些是非常主觀的,有些是客觀的。

我使用了兩者的組合,只有輕微的變化 - 單個var語句,範圍的頂部。

var x = function() { 
    var i, 
     l; 

    for (i = 0, l = [].length; i < l; i += 1) { 
     // make something 
    } 
}; 

原因是,我喜歡每範圍(功能)的單一var語句,並聲明是在範圍的頂部。 JSLint/JSHint默認強制執行此操作。客觀地說,它有助於避免JS提升機制出現問題,該機制在預執行階段將所有變量聲明移至作用域頂部。不可否認,主觀上,後面的開發人員很清楚在這個範圍內引入了哪些變量。假定範圍內使用的任何其他變量都假定來自更高級別的範圍。

+1

他的第一個方法也使用了單個'var',它和你所做的一樣。 – Sarfraz 2012-02-21 15:16:13

+1

@Sarfraz整個函數的單個var語句,而不僅僅是循環。 – 2012-02-21 15:16:56

+0

@Sarfraz真的,但不在範圍的頂部,這就是我爲什麼這麼說的原因。我會編輯說我使用兩個組合... – JAAulde 2012-02-21 15:17:06

1

不,這兩個都是正確的。我更喜歡第一個自己。

不正確的方法是:

for (var i = l = 0; ...; ...) { 
    ... 
} 

哪裏有我和L至極之間沒有逗號引起l至是全球性的。

0

不,至少在Chrome中,範圍完全相同,兩種方式都是相同的。

1

在javascript中,除了可維護性以外沒有任何區別。保持聲明和使用密切有助於提高可讀性。你應該選擇哪一個更具可讀性。

0

爲什麼比第一個更喜歡第二個的原因是JS中的變量沒有塊範圍,而是詞法(或函數)範圍,這意味着變量在它們被定義的函數內是可見的在嵌套函數中也是可見的)。

實施例:

function foo() { 
    for (var i = 0; i < 10; i++) { 
     alert(i); 
    } 

    alert(i); // works, because i has lexical scope 
} 

在大多數類似C語言中,變量具有塊範圍,這意味着它們在那裏它們被限定在塊內是可見的,所以:

void foo() { 
    for (int i = 0; i < 10; i++) { 
     print(i); 
    } 
} 

print(i); // won't work, i is not visible any more 

所以,人們來自像Java/C/C++這樣的語言可能會認爲第一個例子中的var i有塊範圍,實際上它沒有。這就是爲什麼一些程序員更喜歡在函數的開頭聲明所有變量。

就我個人而言,我認爲即使這樣你應該堅持習慣,儘可能將變量聲明爲使用它們的地方。

編輯

正如JAAulde提到的,如果你真的瞭解JS的範圍規則(和怪癖),你應該只申報接近其使用的變量。

+1

堅持使用「聲明接近使用」的唯一問題是JS不是C.JS具有提升機制,這是一個怪異的問題,當var聲明在整個地方完成時,如果沒有正確理解機制,就會引發問題。 – JAAulde 2012-02-21 15:33:22

0

其實根據全能的crockford還有:因爲javascript有函數作用域,所以最好總是在函數頭部聲明變量的第一件事。

但是,正如其他人指出的那樣,它並不重要,應該根據個人品味和可讀性來完成。