JavaScript中的分号插入机制详细介绍


Posted in Javascript onFebruary 11, 2015

仅在}之前、一个或多个换行之后和程序输入的结尾被插入

也就是说你只能在一行、一个代码块和一段程序结束的地方省略分号。

也就是说你可以写如下代码

function square(x) {

    var n = +x

    return n * n

}

但是却不可以写的像下面代码一样,这样就报错了哦
function area(r) {    r = +r    return Math.PI*r*r }//error

仅在随后的输入标记不能解析时插入

也就是说分号插入是一种错误校正机制。看代码说话

a = b

(f())

//能正确的解析为一条单独的语句  单价于下面这条语句

a = b(f())
a = b

f()

//被解析为两条独立的语句

a = bf();//解析有误

所以你必须得注意下一条语句的开始,从而确定你是否能够合法的省略分号。

(、[、+、-、和/  这五个字符开始的语句,那么最好前面不要省略分号。

举例说明一下哦

a = b

['r', 'g', 'b'].forEach(function (key) {

    console.log(key);

});

本来你以为没有错误,但是解析器却解析成了如下语句
a = b['r', 'g', 'b'].forEach(function (key) {

    console.log(key);

});

因为第二句语句是以[开始的,所以解析器不会在第一条语句后自动插入分号,这样就解析成了如上所示,上面的式子解析时b['b'].forEach难道不是错的吗?

所以(、[、+、-、和/  这五个字符开始的语句,那么最好前面不要省略分号。

想省略分号,有经验的程序员会在该语句的后面跟一个声明语句,以保证解析器解析正确。如下所示

a = b

var x//特意在此加了声明语句以保证a = b不会和(f())解析到一块儿

(f())

所以如果你需要省略分号,必须检查接下来的一行开始标记是否为上述五个字符导致解析器会禁用自动插入分号,或者你也可以在(、[、+、-、和/  这五个字符前置一个分号

省略分号导致脚本连接问题

//file1.js

(function () {

    //......

})()
//file2.js

(function () {

    //......

})()

上述两个文件连接时,就会被解析成如下

(function () {

    //......

})()(function () {

    //......

})()

所以省略分号不仅需要当心当前文件的下一个标记,而且还需要当心脚本连接后可能出现在语句之后的任一标记。

为避免解析器解析错误,你可以在每个文件前缀一个额外的分号以保护脚本免受粗心连接的影响。如果文件最开始的语句以上述5个脆弱字符开关,你就应该添加额外的分号前缀。

JavaScript语法限制产生式

JavaScript语法限制产生式:不允许在两个字符之间出现换行。

举例说明:

return

{};

上述代码就被解析成了
return;

{}

;

自增自减运算的分号插入规则

a

++

b

大家想想上述代码会被解析成什么样?说出谜底吧,因为自增运算符既可以作为前置运算符又可以作为后置运算符,但是后置运算符不能出现在换行之前,所以上述代码被解析成了
a;

++b;

分号不会作为分隔符在for循环空语句的头部被自动插入

for (var i = 0,total=1

    i < length

    i++) {

    total*=i;

}

像上述的代码就会出现解析错误。

空循环体的while同样也需要显示的分号,否则也会导致解析错误

function mytest() {

    while   (true)

}

必须写成如下才不会报错哦
function mytest() {

    while   (true) ;

}

总结一下哦

1.仅在}标记之前、一行的结束和程序的结束处推导分号
2.仅在紧接着的标记不能被解析的时候推导分号
3.在以(、[、+、-、和/ 字符开头的语句前绝不能省略分号
4.当脚本连接的时候,在脚本之间显式的插入分号
5.在return、throw、break、continue、++或--的参数之前绝不能换行
6.分号不能作为for循环的头部或空语句的分隔符而被推导出

Javascript 相关文章推荐
解决ueditor jquery javascript 取值问题
Dec 30 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
js实现无限级树形导航列表效果代码
Sep 23 Javascript
限制只能输入数字的实现代码
May 16 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
JavaScript仿微信打飞机游戏
Jul 05 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
vue仿淘宝订单状态的tab切换效果
Jun 23 Javascript
vue实现验证码按钮倒计时功能
Apr 10 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
Mar 05 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
vue实现给div绑定keyup的enter事件
Jul 31 Javascript
Javascript核心读书有感之语句
Feb 11 #Javascript
JavaScript数据结构和算法之二叉树详解
Feb 11 #Javascript
JavaScript中的函数模式详解
Feb 11 #Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 #Javascript
JavaScript数据结构和算法之图和图算法
Feb 11 #Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 #Javascript
JavaScript中的继承方式详解
Feb 11 #Javascript
You might like
PHP面向对象程序设计实例分析
2016/01/26 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
Jquery 插件开发笔记整理
2011/01/17 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
一分钟理解js闭包
2016/05/04 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python 字典dict使用介绍
2014/11/30 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
毕业生个人投资创业计划书
2014/01/04 职场文书
教师节学生演讲稿
2014/09/03 职场文书
中班教师个人总结
2015/02/05 职场文书
爱心募捐通知范文
2015/04/27 职场文书
2015年党小组工作总结
2015/05/26 职场文书
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技