Chrome v8引擎 对多行注释,做词法分析时的bug.
先看一个注释的写法:
/* 个/ */
这个在chrome下会抛出异常.
Uncaught SyntaxError: Unexpected token *
原因是,汉字个的 Unicode 为 4e2a , 而chrome的程序员,为了加速词法分析,简单的使用了下面这种逻辑:
1,扫描到/* ,就快速向后搜索,一但遇到 code point为 2a+\u002f 的情况,他就简单认为这是 */ .所以认为注释结束了. 然后直接忽略掉注释部分,(即把他们从输入元素流中踢出去.注意我之所以提到直接忽略,是因为这里还隐含另外一个bug. 具体的后面解释). 然后继续向后扫描,这时候它遇到了 * ,. 因为这玩意属于ECMAScript的标准的token之一.即属于标点符号中的一个.可能是一个乘法运算符. tokenizer把他作为一个token处理鸟. 那么语法分析时就会是个悲剧.
所以,比如什么 伪/ 等code point是**2a的和/在一起 出现在 多行注释内. chrome就注定悲剧.但是异常信息会有可能不同, 这完全取决于, 伪/ 后面是什么. 比如后面还有 /,那么语法分析时,甚至会认为你这里存在一个错误的正则表达式直接量 相关的异常.比如未闭合的,正则表达式文法的 goal symbol.
我觉得chrome的程序员大概是认为,注释都是ascii字符.因为ascii字符中只有*星号是符合**2a的字符. 如果这样的话,我们有理由举起个反对语言歧视的牌子.去喷google. 毕竟这么多国家,这么多语种的程序员.写注释都得写英文么?
再说说另外一个关于词法分析期,chrome 对多行注释扫描,偷懒的现象. 当然,这个问题,不仅仅是chrome有.还有一些其他浏览器.
alert(function(){ return /* */ 1; }()); // 打印1的,没有遵守标准.
补充说明:xxx版本号-的形式 ,就是这个版本之前(包括这个版本)都如此.