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

 更新时间:2015年02月11日 11:09:07   投稿:junjie  
这篇文章主要介绍了JavaScript中的分号插入机制详细介绍,本文讲解JavaScript中各种情况下的分号插入机制,需要的朋友可以参考下

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

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

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

复制代码 代码如下:

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中Date类型和Math类型详解

    Javascript中Date类型和Math类型详解

    这篇文章主要给大家介绍了Javascript中Date类型和Math类型的一些基础知识,非常的实用,有需要的小伙伴可以参考下
    2016-02-02
  • IE6浏览器下resize事件被执行了多次解决方法

    IE6浏览器下resize事件被执行了多次解决方法

    在IE浏览器下,一次resize事件被执行了多次,这是IE6和IE7的一个比较广为认知的问题,这个问题在这两个版本的浏览器中表现有所不同,通常IE6下会比IE7下更为糟糕,接下来将介绍解决方法,需要的朋友可以参考下
    2012-12-12
  • Javascript基础_简单比较undefined和null 值

    Javascript基础_简单比较undefined和null 值

    下面小编就为大家带来一篇Javascript基础_简单比较undefined和null 值。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • javascript操作符

    javascript操作符"!~"详解

    这篇文章主要详细介绍了javascript操作符"!~",最基本也最容易忽略的东西,混了几年连基本都没了,被人问到得贻笑大方。
    2015-02-02
  • THREE.JS入门教程(5)你应当知道的十件事

    THREE.JS入门教程(5)你应当知道的十件事

    Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D,本文会让你了解一下使用THREE.JS处理3D/避免SetInterval/使用倒序循环等等,感兴趣的朋友可以了解下哦
    2013-01-01
  • JavaScript中使用指数方法Math.exp()的简介

    JavaScript中使用指数方法Math.exp()的简介

    这篇文章主要介绍了JavaScript中使用指数方法Math.exp(),是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06
  • 使图片旋转的3种解决方案

    使图片旋转的3种解决方案

    这篇文章主要介绍了使图片旋转的3种解决方案,并了几个方法的对比,大家参考看一下吧
    2013-11-11
  • Javascript 基础---Ajax入门必看

    Javascript 基础---Ajax入门必看

    下面小编就为大家带来一篇Javascript 基础---Ajax入门必看。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • javascript es6的常用语法你知道吗

    javascript es6的常用语法你知道吗

    这篇文章主要为大家介绍了javascriptes6的常用语法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 详细分析JS函数去抖和节流

    详细分析JS函数去抖和节流

    这篇文章主要介绍了详细分析JS函数去抖和节流相关知识以及代码分析,需要的朋友学习参考下吧。
    2017-12-12

最新评论