2013-10-14 45 views
3

所以, 我一直使用結構類型以測試變量的存在測試時變種是不確定的:未捕獲的ReferenceError:爲truthy

if(foo){ 
    doThings(); 
} 

現在,我發現了一個

Uncaught ReferenceError: foo is undefined 

這是一個fiddle

這是一個事實,該變種甚至從未被宣佈。 我的問題是,這是正常的行爲?我已經使用過很多次了,我認爲這不是第一次沒有聲明變量;我幾乎可以肯定,我從來沒有遇到過這個問題,它只是返回假,沒有得到的條件。

歡迎任何幫助和澄清。

回答

4

如果變量尚未聲明然後試圖引用它會導致基準誤差。

如果一個變量已被聲明但未被賦值,那麼它將隱含地具有值undefined,並且您的代碼將按預期工作。

在你的情況,這是發生了什麼:

  • Evaluate the if statement [IF(表達聲明]
    • 這涉及評估表達,它返回一個參考,因爲每10.3.1
    • 致電GetValue上返回的參考
      • 如果參考無法解析(它的值是undefined),扔引用錯誤
    • 參考值強制轉換爲布爾值

的算法確定引用的值遍歷嵌套的詞彙環境鏈,直到它到達最外層的上下文爲止。當它達到那個點時,仍然沒有找到提供的標識符的綁定,它將返回一個基準值爲undefined的引用。

當引用的基值爲undefined時,引用被稱爲「unresolvable」,並且引用無法解析時,引用它的任何嘗試都將導致(不出所料)出現引用錯誤。

+0

我編輯了這個問題。我沒有使用「var」,它只是這裏的一個別名 –

+0

@AndréAlçadaPadez - 我知道,我的答案與您使用的標識符無關。 –

+0

對不起,這個評論不適合你:)你的答案是正確的。謝謝 –

0

var是一個保留關鍵字在Javascript中。

以下是對應的錯誤

Uncaught SyntaxError: Unexpected token var 
+2

我編輯的問題。我沒有使用「var」這只是這裏的別名 –

2

檢查更新的小提琴。如果你還沒有聲明一個變量,那麼在條件下你將不得不檢查它的類型。

var a = 1; 
var b; 


try{ 
    if(typeof(c)!='undefined') { 
     alert("OK"); 
    } 
} catch(ex){ 
    alert(ex); 
} 

fiddle

+0

謝謝,我知道這一點;我只是不知道我問的是默認行爲。 –

+1

是的,這是一個JavaScript變量的正常行爲.. –

相關問題