博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
防止 JavaScript 自动插入分号
阅读量:5836 次
发布时间:2019-06-18

本文共 1192 字,大约阅读时间需要 3 分钟。

    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;

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

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

 

转载地址:http://amccx.baihongyu.com/

你可能感兴趣的文章
SpringBoot下Redis相关配置是如何被初始化的
查看>>
为你的AliOS Things应用增加自定义cli命令
查看>>
MongoDB 创建基础索引、组合索引、唯一索引以及优化
查看>>
百度PaddlePaddle常规赛NLP赛道火热开启
查看>>
稳了!这才是cookie,session与token的真正区别
查看>>
python项目实战:制作一个简易的GUI界面浏览器
查看>>
OSChina 周二乱弹 —— 假期余额已不足!
查看>>
前端那些事之React篇--helloword
查看>>
ios的google解析XML框架GDataXML的配置及使用
查看>>
netty-当一个客户端连接到来的时候发生了什么
查看>>
PHP_5.3.20 源码编译安装PHP-FPM
查看>>
在51CTO三年年+了,你也来晒晒
查看>>
js控制图片等比例缩放
查看>>
Java高级开发工程师面试考纲
查看>>
FreeMarker表达式
查看>>
No module named 'apt_pkg' 出错
查看>>
Debian9.2 下使用vnstat查看服务器带宽流量统计
查看>>
NGINX + PHP-FPM 502
查看>>
mysql数据备份与恢复
查看>>
Openstack API常用命令
查看>>