2009-11-10 117 views
18

從本質上說,我想申報while循環的條件部分的變量在javascript:聲明中,而條件變量在JavaScript

while (var b=a.pop()) { 
    do_sth(b) 
} 

然而,我的瀏覽器(Firefox)不接受。相反,我必須這樣走:

var b 
while (b=a.pop()) { 
    do_sth(b) 
} 

哪些工作。預期這種行爲?

+1

下面的2解釋了變量聲明的提升,但並沒有解釋爲什麼你不能在'while'條件中聲明一個變量(但你可以,例如,在'for'條件下)。你有沒有找到一個很好的解釋呢? – Barney 2014-03-04 11:03:45

+2

另一個JS怪癖,這就是爲什麼。 – 2014-12-17 10:13:50

回答

16

JavaScript沒有塊範圍。它具有功能範圍。爲了確保人類和JavaScript都以相同的方式讀取代碼,您應該手動提升您的var聲明直到函數的頂部。

這裏是JSLint說,關於你的代碼:

Problem at line 1 character 8: Expected an identifier and instead saw 'var'. 

使用的JSLint,至少當你學習JavaScript。你會很快學到很多東西。它會傷害你的感情。

+0

這不再是這種情況,讓我 – Ced 2016-12-25 03:30:30

23

是的。

如果你願意,你可以使用一個for循環,就像這樣:

for (var b; b = a.pop();) {  //Note the final semicolon 
    do_sth(b); 
} 
6

JavaScript沒有塊範圍。所以所有var聲明都在函數範圍內。所以在while表達式中聲明一個變量在JavaScript中沒有意義。

此外,你應該用分號結束你的語句。這不是絕對必要的,但強烈建議。

16

這個問題有點過時了,但我認爲答案都會錯過一個重要的區別。也就是說,while循環期望表達式,其被蒸發爲條件的,即可以被轉換爲布爾值的布爾值或值。詳情請參閱Mozilla docs

純賦值(無實例化)通過其默認返回值(右側的值)強制爲布爾值。

一個var(或letconst)是聲明,允許一個可選的分配,但有undefined返回值。單獨

var foo = 42; // undefined 
bar = 42  // 42 

返回值不回答這個問題,因爲undefined是falsey,但也表明,即使JS讓你把一個var在:

您可以在控制檯輕鬆地測試此有條件的,它總是會評估爲false。

其他人提到了for語句,並且它們允許聲明和實例化變量。這是真的,但for期待一個聲明或assigment documentation explains

意見可能會有所不同,但對於我來說,所有這些都增加了一個可理解的一致性,而不是循環中行爲的怪癖。A while循環更好地被認爲是if語句的循環版本,而不是類似於for循環。如果在所有這些方面都有些怪異的話,那麼它就是語言與語言正常語法的完全不同。

+2

我在找'爲什麼?' JavaScript不允許const,let,var,而條件和這回答了我的問題。我總是發現令人困惑的是,當我創建一個新變量而不是變量的值時,控制檯報告未定義。 我仍然沒有看到JavaScript的點返回undefined;他們也可以返回變量的值,但是如果它返回undefined,更好的瀏覽器和編譯器在條件中使用時會出錯。 – 2017-07-29 21:30:34