2014-01-23 27 views
0

檢查時,這個互動谷歌瀏覽器的控制檯日誌:JavaScript錯誤使用未定義的變量

test_1 = 'ok' 
> "ok" 

test_2 = test_2 || 'ok' 
> ReferenceError: test_2 is not defined 

var test_3 = test_3 || 'ok' 
> undefined 

test_1 
> "ok" 

test_2 
> ReferenceError: test_2 is not defined 

test_3 
> "ok" 

當我打電話test_1 = 'ok'我離開了var構造,但瀏覽器還了解到這一點。我假設它填充了我省略的var,就像它用分號填充一樣。

但對於test_2 = test_2 || 'ok'我收到一個錯誤。我知道test_2沒有定義,但它不會保留我的下一個示例test_3無法工作。由於某種原因,缺少var聲明成爲一個問題。

有人可以向我解釋爲什麼解釋器會在那裏引發錯誤嗎?

+2

[JavaScript'hoisting'](http://stackoverflow.com/questions/15311158/javascript-hoisting)也看看[JavaScript範圍和提升](http://www.adequatelygood.com/JavaScript-Scoping- and-Hoisting.html) – Givi

+0

你可以省略'var',它意味着你的變量是全局的。 – elclanrs

+2

我不明白你爲什麼低估這一點。 – bgusach

回答

2

總之,提升。

就拿第三個例子,認爲 「作品」:

var test_3 = test_3 || 'ok' 

什麼的JavaScript實際上做的是以下幾點:

var test_3; 

test_3 = test_3 || 'ok'; 

現在test_3聲明,指test_3只是返回undefined,而不是投擲一個ReferenceError,所以你基本上做的是這樣的:

var test_3; 

test_3 = undefined || 'ok'; 

對於第二個例子,這是不正確的,因爲test_2從未被聲明。

+3

「這與第二個例子不同,因爲'test_2'從未定義過。」你的意思是從來沒有宣佈過。 –

+0

@DavidKnipe我這樣做,謝謝你的糾正。 – mc10