2011-03-22 44 views
2

我剛剛花了大約四個小時來追蹤這個問題。我知道是什麼造成的,但不知道爲什麼,以及「爲什麼」在擾亂我。在JavaScript中導致「'foo'未定義」的分號丟失在IE9中的錯誤

我有以下的.js文件:

function funcA() { 
} 
function funcB() { 
    do { 
    } while (1 == 1) return 0 
} 

我也有以下的HTML頁面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
    <title></title> 
    <script src="JScript1.js" type="text/javascript"></script> 
</head> 
<body> 
    <script type="text/javascript"> 
     new funcA(); 
    </script> 
</body> 
</html> 

當我加載頁面在IE9中我得到一個錯誤,「 'FuncA的'沒有定義。「我可以擺脫運行時錯誤做以下任何一個

  • 打開兼容性視圖在IE9
  • 從頁面
  • 添加一個分號後除去DOCTYPE在返回JavaScript之前(即while(1 = 1); return 0)

任何人都可以幫助我理解這裏究竟發生了什麼?

+3

'1 = 1'是作爲yntax錯誤以及... – delnan 2011-03-22 20:19:36

+1

整個語句'} while(1 = 1)return 0'是錯誤的。 – mplungjan 2011-03-22 20:40:05

+0

我發佈的代碼是嚴格精簡的實際代碼版本。不管上面提到的幾點,我的文章的其餘部分對導致錯誤出現和消失的情況都是準確的。 – 2011-03-22 20:52:01

回答

1

不幸的是,JavaScript並不要求您在任何地方明確地放置分號,但應該有一個 - 但它會在內部爲您添加。這通常會導致難以追蹤錯誤和意外行爲。

在代碼中的其他語法錯誤(如其他人指出的),在do-whilewhile;需要,當你擺在那裏,事情你期望他們的工作。如果沒有這樣做,那麼偶然的開發人員幾乎不可能預測不同的環境將如何表現,而不深入研究該語言的規格以及JS引擎的全部理解 - 假設實現中沒有缺陷的JS引擎本身。 Little things such as whether you have braces ({ and }) in the same line or not can make a difference

+3

擴大NGAC的偉大答案,這就是www.jslint.com發明的原因。 (並不是說我同意jslint所做的所有決定 - 事實上,在它最近的化身中,由於對var出現的地方有驚人的挑剔,它是無用的!) – 2011-03-22 20:38:34

+3

@DDaviesBrackett其他人對jslint也有同感,並且提出了一個替代方案:http://jshint.com/ – Zikes 2011-03-22 20:55:28

+0

關於試圖調試這個問題最糟糕的部分是實際的js文件是一個縮小的文件,它有超過40,000一行中的字符。我不得不通過javascript美化器(http://jsbeautifier.org)運行它,以便我可以讀取它。我也通過jslint運行它,它報告了很多違規行爲,主要是缺少大括號和分號,但原始文件是我們購買的軟件包的一部分,所以我不想對其進行太多更改。這似乎很奇怪,在一個函數中丟失的分號會導致IE抱怨它找不到其他函數。 – 2011-03-22 20:58:16

0

從我對ECMAScript spec的閱讀中,IE的行爲是正確的。見部分:

自動分號插入(其描述了 情況,其中分號可以是 插入,其中沒有適用)的
  • 7.9.1規則

  • 12.6。 1 do-while語句(這表明您的代碼不是有效的生產形式do Statement while (Expression);

+1

哪種IE行爲正確,開啓或關閉兼容模式的行爲?爲什麼DOCTYPE存在或不起作用? – 2011-03-24 17:22:19

相關問題