2012-01-20 42 views
3

具有編碼的JavaScript,我有一個很簡單的問題,我不能清楚地證明/反駁使用的jsfiddle澄清一個JavaScript變量問題

在連接到CV一些JS我發現了一些問題,我想驗證 - 其中之一是 變量在同一函數中的多個聲明

測試它似乎允許在新的瀏覽器(OSX Chrome16 Fx 10beta) - 據我所知,它曾用來給出錯誤(Netscape/Mozilla/Fx1/IE5左右):

function something() { 
    var var1 = ""; 
. 
/* reams of code which scrolls the first declaration off the screen 
    so the author likely forgot the var was already declared earlier 
    in the same function */ 
. 
    var var1 = ""; // could this result in an error in some browsers? 
} 

我的小提琴是here

回答

3

不受限制,只要我知道,我已經看到了多個JavaScript函數for循環的每個宣告自己var i爲至少6年都沒有問題。在看了這個規範之後,這個領域似乎沒有什麼具體的東西,但是自從(特別是全局的)變量名覆蓋(讀取:衝突)以來,這個功能自成立以來一直是一個特性,如果對多個宣佈被強制執行。現在,我建議它不會在javascript中顯示特別好的範圍確定(並提升),但仍然是有效的代碼。

+0

謝謝 - 我依稀記得Netscape或Mozilla或FX 1左右給我一個錯誤,但由於它只是對我來說發生過一次,也可能是我錯了 - 我知道它在for循環,但這對我來說是非常本地的範圍 – mplungjan

+0

@mplungjan for循環中的'var i'會像函數作用域中聲明的任何其他變量一樣被提升到函數的頂部 - 循環中的所有'i's都會引用到同一個變量。情況與你描述的情況類似。 –

+0

對。指出。謝謝 – mplungjan

2

我一直在玩JavaScript,只有你一個人,我不記得這個曾經被解釋者禁止的東西。查看ECMAScript 1規範,我沒有看到提及確保變量聲明在給定範圍內是唯一的;這將是一個奇怪的功能要刪除。

缺少這樣的檢查以及變量是函數而不是塊範圍的事實是似乎會引起誤解的事情之一,其中一個塊中的「聲明」變量意外地具有最後一個值它在前面的塊中。

+0

謝謝 - 我很確定,但我從來沒有自己的問題,所以我想我會問 – mplungjan

2

我很確定解析器忽略了第二個「var」聲明,因爲它是多餘的 - 它所做的只是表示變量侷限於本地作用域。沒有理由在同一個作用域中使用它兩次,就像在同一個函數中一樣,但是如果你像@ rich.okelly所指出的那樣,有循環或者函數,你確實可以使用「var」來創建一個局部變量名稱作爲更高範圍內的變量。這不太好,當然也不會爲可讀性做任何奇蹟,但這是可能的。我從來沒有遇到過一個瀏覽器掛上了一個變量「var」兩次。

例子:

x = "Hello"; 

function test() { 
    alert(x); // Outputs "Hello" 
} 
function test2() { 
    var x = "local variable"; 
    alert(x); // ouputs "local variable" 
    var x = "changed the variable"; // this does exactly the same thing as if you'd omitted "var" 
} 
alert(x); // Outputs "Hello" 
+0

是的,這是我的小提琴在Fx10/Chrome16中做的,但這不足以讓我以表面看待它。 – mplungjan