防止 JavaScript 自动插入分号

简介:

 JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符。

   然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,因此程序可以利用空格格式化代码。

   这两种机制的冲突,很容易掩盖更为严重的解析错误。有时会不合时宜地插入分号。

   例如,在return语句中自动插入分号将会导致这样的后果:

   如果return语句要返回一个值,这个值的表达式的开始部分必须和return在同一行上,例如:

复制代码
    var f = function(){

    return

    {

    status: true

    };

    }
复制代码

   看起来这里要返回一个包含status成员元素的对象。

   不幸的是,JavaScript自动插入分号让它返回了undefined,从而导致下面真正要返回的对象被忽略。

   当自动插入分号导致程序被误解时,并不会有任何警告提醒。

   如果把{放在上一行的尾部而不是下一行的头部,就可以避免该问题,例如:

复制代码
    var f = function(){

    return {

    status: true

    };

    }
复制代码

   为了避免省略分号引起的错误,建议养成好的习惯,不管一行内语句是否完整,只要是完整的语句都必须增加分号以表示句子结束。

   为了方便阅读,当长句子需要分行显示时,在分行时应确保一行内不能形成完整的逻辑语义。

   例如,下面代码是一条连续赋值的语句,通过分行显示可以更清楚地查看它们的关系。

   这种分行显示,由于一行内不能形成独立的逻辑语义,因此JavaScript不会把每一行视为独立的句子,从而不会产生歧义。

    var a =

    b =

    c =  4;

   以上语句在一行内显示如下: var a = b = c = 4;

   对于下面这条语句,如果不能正确分行显示,就很容易产生歧义。

   该句子的含义:定义一个变量i,然后为其赋值,如果变量a为true,则赋值为1,否则就判断变量b,如果b为true,则赋值为2,否则就判断变量c,如果c为true,则赋值为3,否则赋值为4.

    var i = a ? 1 : b ? 2 : c ? 3 : 4;

   下面的分行显示就是错误的,因为表达式a ? 1: b能够形成独立的逻辑语义,所以JavaScript会自动在其后添加分号来表示一个独立的句子。

    var i = a ? 1: b

    ? 2 : c

    ? 3 : 4;

    安全的方法应该采用如下的分行显示,这样每一行都不能形成独立的语义。

复制代码
  var i = a ? 1

    : b ? 2

    : c ? 3

    : 4;
复制代码

   总之,在编写代码时,应养成使用分号结束句子的良好习惯,凡是完整的句子就应该使用分号进行分隔。

   分行显示的句子应该确保单行不容易形成独立的合法的逻辑语义。

 本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/3140675.html,如需转载请自行联系原作者

相关文章
|
12月前
|
JavaScript
node.js 分号问题
node.js 分号问题
|
前端开发 JavaScript
重学前端 29 # JavaScript中要不要加分号?
重学前端 29 # JavaScript中要不要加分号?
78 0
重学前端 29 # JavaScript中要不要加分号?
|
JavaScript 前端开发
JavaScript 代码结构:语句、分号和注释
JavaScript 代码结构:语句、分号和注释
140 0
JavaScript 代码结构:语句、分号和注释
|
JavaScript 前端开发
[翻译] 国外大神的js 分号使用指南
• Required: When two statements are on the same line 必备: 当两个语句在同一行时 var i = 0; i++ // <-- semicolon obligatory // (but optional before newline) var i = 0 // <-- semicolon optional i++ // <-- semicolon optional • Optional: After statement
89 0
|
JavaScript 前端开发 开发者
JavaScript ASI 机制详解,不用再纠结分号问题
关于要不要加分号的问题,其实有很多争论!有的坚持加分号,而有的不喜欢加分号...但是无论那种风格,都不能百分百避免某些特殊情况产生的问题,究其根本就是因为对 JavaScript 解析和 ASI 规则的不了解。
283 0
|
JavaScript 前端开发
JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义
JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义
118 0
JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义
|
JavaScript 前端开发
JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义
JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义
130 0
JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义
|
JavaScript 前端开发
JS的分号可以省掉吗?
写不写分号,这是个有趣的问题....
1350 0
|
JavaScript 前端开发 Java
不为人知的JavaScript自动分号插入机制( ASI )
JavaScript拥有自由的精神, ASI就是此精神的表现形式之一, ASI是Automatic semicolon insertion 的缩写, 在许多语句后面可以省略分号, 当然很多小白还没有发现这一点... ASI的引入方便了开发者的同时也带来了很多坑........ 本文介绍了自动插入分号机制在return语句中的例子,以及在es5标准下的相应规则。
2364 0
|
JavaScript 前端开发 安全
JS编程建议——5:防止JavaScript自动插入分号
5:防止JavaScript自动插入分号
1190 0