2011-11-17 63 views
1

以下javascript在Chrome和IE中可用,但在Firefox中出錯,因爲bar在分配給callBar時未定義。跨瀏覽器的Javascript函數範圍問題

那麼誰的範圍規則是正確的?

function foo() { 

    var callBar = bar; 

    if (1 === 1) { 
     callBar(); 
     function bar() { 
      alert('yo'); 
     } 
    } 
} 

foo(); 
+0

雖然這是一個有趣的腦筋急轉彎,你真的有這樣的代碼嗎?函數(應該)被掛起,因此有條件地定義它們是沒有意義的。 –

回答

5

不知道誰得到它「正確」根據ECMA規範,但它其實並不重要,因爲你不能在所有的瀏覽器做到這一點,必須改變你的代碼:)

簡單的解釋是if聲明中的function s在技術上是不允許的,瀏覽器對它們做奇怪的事情。有些瀏覽器將此視爲表達式,其他瀏覽器將其視爲聲明。 FF顯然認爲它是一個表達式,意味着它直到代碼到達那一點才存在。詳細的說明可在http://kangax.github.com/nfe/

+0

謝謝 - 很棒的閱讀 –