此BUG,已修複了. 具體哪個版本修複的,我懶得去驗證了,我手裡的15,16已經是修複了...
先看一個注釋的寫法:
/* 個/ */
這個在chrome下會拋出異常.
Uncaught SyntaxError: Unexpected token *
原因是,漢字個的 Unicode 為 4e2a , 而chrome的程式員,為了加速詞法分析,簡單的使用了下面這種邏輯:
1,掃描到/* ,就快速向後搜尋,一但遇到 code point為 2a+\u002f 的情況,他就簡單認為這是 */ .所以認為注釋結束了. 然後直接忽略掉注釋部分,(即把他們從輸入元素流中踢出去.注意我之所以提到直接忽略,是因為這裡還隱含另外一個bug. 具體的後面解釋). 然後繼續向後掃描,這時候它遇到了 * ,. 因為這玩意屬於ECMAScript的標準的token之一.即屬於標點符號中的一個.可能是一個乘法運算子. tokenizer把他作為一個token處理鳥. 那麼文法分析時就會是個悲劇.
所以,比如什麼 偽/ 等code point是**2a的和/在一起 出現在 多行注釋內. chrome就註定悲劇.但是異常資訊會有可能不同, 這完全取決於, 偽/ 後面是什麼. 比如後面還有 /,那麼文法分析時,甚至會認為你這裡存在一個錯誤的Regex直接量 相關的異常.比如未閉合的,Regex文法的 goal symbol.
我覺得chrome的程式員大概是認為,注釋都是ascii字元.因為ascii字元中只有*星號是符合**2a的字元. 如果這樣的話,我們有理由舉起個反對語言歧視的牌子.去噴google. 畢竟這麼多國家,這麼多語種的程式員.寫注釋都得寫英文嗎?
再說說另外一個關於詞法分析期,chrome 對多行注釋掃描,偷懶的現象. 當然,這個問題,不僅僅是chrome有.還有一些其他瀏覽器.
參考下面的代碼:
alert(function(){ return /* */ 1; }()); // 列印1的,沒有遵守標準. ECMA262 Edition3,5.中對於多行注釋中,存在行終結符的情況,都是一致的.要求這個多行注釋,不是簡單的被忽略,而是要被替換為一個行終結符插入到流中.而一旦return 和 1之間的多行注釋被替換為一個行終結符,則ECMA262的自動插入分號機制,就要產生作用.自動在token 1前面加入分號.那麼列印undefined.才是符合標準的做法. 對於這一點,瀏覽器的實現並不一致. IE6-IE8, Firefox0.8-Firefox3.0, Safari5-, chrome11- 都列印1.即並沒有遵守標準.而 IE9 , Firefox3.5+ , Opera11-(測到9.2),則列印undefined,遵守了標準.
補充說明:xxx版本號碼-的形式 ,就是這個版本之前(包括這個版本)都如此.