2013-10-24 14 views
1

我一直認爲JavaScript源代碼中的所有空格(空格,製表符,換行符)都是「相等的」,即它們都有效地區分了諸如標識符,關鍵字,運算符等語言元素JavaScript源代碼中的換行符或空格/製表符有所不同? (甚至在評論中!?)

但是,我注意到了新行與空格或製表符之間的奇怪差異。 即使在評論裏面!

該工程確定:

var bla = function() { alert('hello') } 
bla(); 

這也適用(函數定義和函數調用,但別無分號之間換行符):(分號收盤之間}字符和bla(下)函數調用)

var bla = function() { alert('hello') };bla(); 

然而,這並不工作:(無差異是否只是一個空格或製表符,或多次,或無)

var bla = function() { alert('hello') } bla(); 

它變得更加陌生。

這不起作用或者:

var bla = function() { alert('hello') } /* ; */ bla(); 

(含有空格,製表符和分號隔開評論)但這:(含註釋換行符)

var bla = function() { alert('hello') }/* 
*/bla(); 

直播的jsfiddle演示:

這是在JavaScript中的錯誤,還是我失去了一些東西?

+0

[Here's](http://coding.smashingmagazine.com/2011/05/30/10-oddities-and-secrets-about-javascript/)[some](http://www.slideshare.net/ pigulla/javascript-wtfs-8148743)[more ...](http://stackoverflow.com/questions/1995113/strangest-language-feature)。如果你寫[好Javascript](http://javascript.crockford.com/),你會忍受更少的痛苦。 – tjameson

回答

3

這不是白色空間的行爲不端,它是JavaScript的「ASI」功能:「自動分號插入」。

這是JavaScript語言第一次引入時的一項功能。基本上,這筆交易是這樣的:

核心JS語言要求每個語句以分號終止。

但是,由於該語言針對的是網頁設計師(當時誰不被認爲是程序員),如果開發人員忘記了包含分號,則該解析器被修改爲寬鬆。如果解析器認爲分號丟失,但存在換行符,則會假定分號是有意的。

坦率地說,這是在語言的設計真的真的錯誤的決定:它導致了許多已知的怪癖,可能導致它可以是很難調試問題。尤其是,您需要非常小心地處理返回多線對象結構的return語句,但您可以通過其他許多方法來解決問題,如您的問題所示。

在這裏學習的教訓很簡單:總是包含你的JS語句之間的分號,即使它們看起來是可選的

如果你對這個話題真的很感興趣,那麼你可以read more about ASI here,作爲一個Javascript程序員,這是一件很重要的事情。但是一般情況下,如果你只是包含你的分號,你大都可以忘記它。

+0

永遠不會意識到這一點,thx! – Rogier

相關問題