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循环的头部或空语句的分隔符而被推导出
时间: 2024-10-24 23:44:34

JavaScript中的分号插入机制的相关文章

JS魔法堂:ASI(自动分号插入机制)和前置分号

一.前言 今晚在知乎看到百姓网前端技术专家——贺师俊对<JavaScript 语句后应该加分号么?>的回答,让我又一次看到大牛的风采,实在佩服万分.但单纯的敬佩是不足以回报他如此优秀的文字,必须深入理解文字的含义和背后的原理才不愧呢! 在这之前我们需要先理解ASI(自动分号插入机制). 二. Automatic Semicolon Insertion (ASI, 自动分号插入机制)   主要参考:http://justjavac.com/javascript/2013/04/22/automa

javascript中的错误处理机制

前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验.由于任何javascript错误都可能导致网页无法使用,因此作为开发人员,必须要知道何时可能出错,为什么会出错,以及会出什么错.本文将详细介绍javascript中的错误处理机制 error对象 error对象是包含错误信息的对象,是javascript的原生对象.当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个程序

JavaScript中的垃圾回收机制与内存泄露

什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他们不会再被用到,但是还没有及时释放,这就叫做内存泄露(memory leak).如果出现了内存泄露,那么有可能 C语言是通过手动分配和释放内存的, 如通过malloc分配,通过free释放,这种方式是比较麻烦的.而java.c#.js等是为了解放程序员的负担,提出了程序自动释放内存,这种方式就是垃圾

Javascript中的事件委托机制

事件委托 事件委托,顾名思义,就是将本来要触发在A元素身上的事件,委托给B元素来触发,例如像onclick,onmouseover等事件都可以通过事件委托去触发. 事件委托实际上是通过事件冒泡的原理,将事件绑定在父元素或者祖先元素上,通过父元素或祖先元素触发相应的事件. 通过单纯的文字描述可能不太好理解,我们来通过代码去看看事件委托机制有哪些优点? 优点1-提高Javascript性能 使用事件委托机制绑定事件,可以减少内存的占用,从而提高事件处理速度.我们通过具体的实例来进行讲解. 我们要完成

JavaScript中的垃圾回收机制

什么是js垃圾回收?(what) JavaScript中也具有自动垃圾回收机制(GC:Garbage Collection); 因为内存内容是极其有限的,所以垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放内存 其中不再使用的变量一般只可能是局部变量,即在函数执行结束的时候,所使用的局部变量所占的内存会随之被回收,当然在闭包中内部函数会占用着外部函数的局部变量. 有哪些垃圾回收方式?(how) 到底哪个变量是没有用的?所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标

[Effective JavaScript 笔记] 第6条:了解分号插入的局限

分号可以省略 js可以在语句结束不强制加分号.(建议还是添加,不添加分号往往会出现不易发现的BUG) function Point(x,y){ this.x=x||0; this.y=y||0; } Point.prototype.isOrigin=function(){ return this.x===0 && this.y===0 } 上面代码可以运行,是由于js可以自动插入分号,它是一种程序解析技术.能推断出某些上下文中省略的分号,然后有效地自动地将分号"插入"到

辛星浅析JavaScript中的编程规范

这是接着上一篇的博文写的,首先说一下编程规范的重要性吧,它可以让我们的代码保持一致性,可预测,更易于阅读和理解.一个新的开发者可以通过阅读规范,理解其他团队成员书写的代码,更快的上手干活. 第一点就是缩进. 很糟糕的一件事就是不一致的缩进,因为它看上去像是遵循了规范,但是可能一路上伴随着混乱和惊奇,重要的是规范的使用缩进. 一些开发人员喜欢用tab制表符缩进,因为任何人都可以调整他们的编辑器以自己喜欢的空格数来显示tab.也有人喜欢用空格,通常是四个空格.一般这个无所谓,只要团队每个人都遵循同一

javascript 中cookie的解析

JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是JavaScript本身的性质. 在上一节,曾经利用一个不变的框架来存储购物栏数据,而商品显示页面是不断变化的,尽管这样能达到一个模拟 全局变量的功能,但并不严谨.例如在导航框架页面内右击,单击快捷菜单中的[刷新]命令,则所有的JavaScript变量都会丢失

JQuery中的事件委托机制:delegate和undelegate

考虑下面这种场景:如果1个div下面有3个button,点击每个按钮的时候,需要打印出当前按钮的ID. <div id="parent"> <input type="button" id="a" value="1"></input> <input type="button" id="b" value="2"></i