如何防止JavaScript自动插入分号


Posted in Javascript onNovember 05, 2015

 在 JavaScript 中,行尾的分号有一种自动插入机制,这样子,可以容忍某些朋友忽略了输入分号。 当然你最好养成输入分号的习惯,同时掌握 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;

    总之,在编写代码时,应养成使用分号结束句子的良好习惯,凡是完整的句子就应该使用分号进行分隔。分行显示的句子应该确保单行不容易形成独立的合法的逻辑语义

PS:示例详解javascript自动在行尾添加分号

 分号(;),通常会用在一行语句的结尾,代码如下:

var webName = "三水点靠木";
var url = 3water.com;

上面的代码,在每一个声明语句后面都添加了分号,这不用多解释。

var webName = "三水点靠木"
var url = 3water.com

其实分号也完全可以省略,但是省略的这个分号,会在编译阶段自动为其添加分号。
再来看一段代码实例:

function done(webName){
 return
 webName
}
console.log(done("三水点靠木"));

由于编译器会在每一行后面都自动添加了分号,所以输出值undefined,不是"三水点靠木"。

Javascript 相关文章推荐
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
jQuery打印指定区域Html页面并自动分页
Jul 04 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
Mar 04 Javascript
javascript实现input file上传图片预览效果
Dec 31 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 Javascript
原生js实现手风琴功能(支持横纵向调用)
Jan 13 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
Aug 31 Javascript
vue中设置、获取、删除cookie的方法
Sep 21 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
Jan 24 Javascript
vue+Element实现搜索关键字高亮功能
May 28 Javascript
layui复选框的全选与取消实现方法
Sep 02 Javascript
javascript常用函数(2)
Nov 05 #Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 #Javascript
javascript常用函数(1)
Nov 04 #Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
Nov 04 #Javascript
jQuery多条件筛选如何实现
Nov 04 #Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
Nov 04 #Javascript
js数组去重的5种算法实现
Nov 04 #Javascript
You might like
MySQL数据源表结构图示
2008/06/05 PHP
PHP 危险函数解释 分析
2009/04/22 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
PHP单链表的实现代码
2016/07/05 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
JS实现随机点名器
2020/04/12 Javascript
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python脚本开机自启的实现方法
2019/06/28 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
自我评价如何写好?
2014/01/05 职场文书
北京大学自荐信范文
2014/01/28 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
西湖英语导游词
2015/02/06 职场文书
销售员自我评价
2015/03/11 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
工程服务质量承诺书
2015/04/29 职场文书
倡议书格式及范文
2015/04/29 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL