根据 ECMAScript 规范12.1 Block 中的描述,“{ [StatementList] }”即一组大括号之间包含有一组语句,这被称作一个“块”(block)。
根据 ECMAScript 规范12.3 Empty Statement 中的描述,单独一个分号“;”是一个“空语句”(EmptyStatement)。
在 ECMAScript 规范的
12.5 The if Statement、12.6.1 The do-while Statement 和 12.14
The try Statement
中,分别描述了“if-else”、“do-while”、“try-catch”的语法,他们有一个共同点:都是一个整体的语句结构(statement)。
也就是说,在“if”和“else”之间、“do”和“while”之间、“try”和“catch”之间是不允许有其他语句存在的,包括“空语句”。
在 IE6 IE7 IE8 中,JavaScript 代码中语句块结束符号“}”之后的第一个分号“;”会被忽略。
若在如“if”和“else”这样的整体语句结构之间插入一个分号“;”(即在“if”块的结束大括号“}”之后插入一个分号“;”),则仅在 IE6 IE7 IE8 中可以正常运行,其他浏览器均会在预处理期出错而使所有代码无法进入解释期,导致页面中的所有 JavaScript 代码均不会正常执行。
IE6 IE7 IE8 |
---|
运行下面三组测试代码:
if(true){ alert("IF"); }; else{ alert("ELSE") }
do{ alert("DO");
}; while(false);
try{ aler("TRY"); };
catch(e){ alert("CATCH"); }
上面三组测试代码中,“if-else”、“do-while”、“try-catch”均为一个整体语句结构,但他们都被一个空语句“;”给分隔开了。
以上代码在各浏览器中的运行结果如下:
IE6 IE7 IE8 | Firefox | Chrome | Safari | Opera |
---|---|---|---|---|
弹出提示框:
“IF” |
syntax error:
else { |
Uncaught SyntaxError:
Unexpected token else |
SyntaxError:
Parse error |
Syntax error:
expected expression, got keyword 'else' |
弹出提示框:
“DO” |
missing while
after do-loop body |
Uncaught SyntaxError:
Unexpected token ; |
SyntaxError:
Parse error |
Syntax error:
syntax error |
弹出提示框:
“TRY” |
missing catch or finally
after try |
Uncaught SyntaxError:
Missing catch or finally after try |
SyntaxError:
Parse error |
Syntax error:
missing catch or finally clause in try statement |
可见:IE6 IE7 IE8 忽略了这个多余的“;”,使代码能够正常解释,而非 IE 浏览器均按照规范对代码进行了解释,提示错误。
进一步测试如下(简单起见,仅以“if-else”语句为例):
if(true){ alert("IF"); };; else{ alert("ELSE") }
这时在所有浏览器中均会出现“语法错误”。
可见,IE6 IE7 IE8 仅可以忽略“}”后的第一个“;”,若“;”多于一个则在构造语法树时也会发生语法错误。1
注:
按照规范书写正确的代码。
操作系统版本: | Windows 7 Ultimate build 7600 |
---|---|
浏览器版本: |
IE6
IE7 IE8 Firefox 3.6.3 Chrome 5.0.375.23 dev Safari 4.0.5 Opera 10.51 |
测试页面: | ... |
本文更新时间: | 2010-08-12 |
brace JavaScript semicolon grammar offending token 分号 语法