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 相关文章推荐
javascript 表单的友好用户体现
Jan 07 Javascript
基于jquery的给文章加入关键字链接
Oct 26 Javascript
JQuery获取文本框中字符长度的代码
Sep 29 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
Oct 12 Javascript
Node.js的包详细介绍
Jan 14 Javascript
js确认框confirm()用法实例详解
Jan 07 Javascript
JavaScript-html标题滚动效果的简单实现
Sep 08 Javascript
详解Sea.js中Module.exports和exports的区别
Feb 12 Javascript
webpack多页面开发实践
Dec 18 Javascript
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 Javascript
vue使用echarts实现水平柱形图实例
Sep 09 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实现网上点歌(二)
2006/10/09 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
2011/06/13 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
Linux中为php配置伪静态
2014/12/17 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
js确定对象类型方法
2012/03/30 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
银行实习生的自我评价
2013/12/09 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
市场营销毕业求职信
2014/08/07 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
2015年中个人总结范文
2015/03/10 职场文书
警示教育片观后感
2015/06/17 职场文书
实习感想范文
2015/08/10 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP