JavaScript中的分号插入机制

简介: 原文:JavaScript中的分号插入机制仅在}之前、一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行、一个代码块和一段程序结束的地方省略分号。 也就是说你可以写如下代码 function square(x) { var n = +x return n * n } 但是却不可以写的像下面代码一样,这样就报错了哦 function area(r) { r = +r return Math.PI*r*r }//error   仅在随后的输入标记不能解析时插入 也就是说分号插入是一种错误校正机制。
原文: 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循环的头部或空语句的分隔符而被推导出
目录
相关文章
|
2月前
|
设计模式 JavaScript 前端开发
深入理解 JavaScript 中的绑定机制(下)
深入理解 JavaScript 中的绑定机制(下)
|
2月前
|
JavaScript 前端开发
深入理解 JavaScript 中的绑定机制(上)
深入理解 JavaScript 中的绑定机制(上)
|
4月前
|
JavaScript 前端开发 数据库连接
js的异常程序处理机制
js的异常程序处理机制
18 0
|
2天前
|
消息中间件 存储 前端开发
理解JavaScript事件循环机制
理解JavaScript事件循环机制
8 1
|
3天前
|
前端开发 JavaScript UED
JavaScript 的事件循环机制是其非阻塞 I/O 模型的核心
JavaScript的事件循环机制是其非阻塞I/O的关键,通过单线程的调用栈和任务队列处理异步任务。当调用栈空时,事件循环从任务队列取出一个任务执行,形成循环。异步操作完成后,回调函数进入任务队列,等待被事件循环处理。微任务如Promise回调在每个宏任务结束后执行。此机制确保JavaScript能高效处理异步操作,不阻塞主线程,提供流畅的用户体验。
7 2
|
11天前
|
JavaScript 前端开发 开发者
【JavaScript技术专栏】JavaScript事件处理机制详解
【4月更文挑战第30天】本文探讨JavaScript中的事件处理机制,涉及事件类型(如click、mouseover)、事件流(冒泡型、捕获型及目标阶段)、事件处理函数(内联与addEventListener方法)以及事件委托(用于优化内存和处理动态元素)。此外,还介绍了事件取消,通过`preventDefault()`和`stopPropagation()`控制事件行为。理解这些概念对构建交互式Web应用至关重要。
|
11天前
|
JavaScript 前端开发
Node.js中的错误处理机制
【4月更文挑战第30天】本文介绍了Node.js的错误处理机制,包括Error对象、try-catch、错误事件监听及Promise和async/await的错误处理。错误通常封装在Error对象中,可自定义错误类型。try-catch用于捕获异常,但不适用于异步错误。事件监听器处理对象发出的&#39;error&#39;事件,防止应用崩溃。Promise的.catch()和async/await结合try-catch用于处理异步错误。良好的错误处理是保证应用健壮性和可靠性的关键。
|
12天前
|
消息中间件 存储 前端开发
理解JavaScript事件循环机制
理解JavaScript事件循环机制
|
17天前
|
前端开发 JavaScript
在JavaScript中,回调函数、Promise和async/await这三种异步处理机制的优缺点
JavaScript的异步处理包括回调函数、Promise和async/await。回调函数简单易懂,但可能导致回调地狱和错误处理困难。Promise通过链式调用改善了这一情况,但仍有回调函数需求和学习成本。async/await提供同步风格代码,增强可读性和错误处理,但需ES8支持,不适用于并发执行。根据项目需求选择合适机制。
|
29天前
|
JavaScript 前端开发
深入探讨JavaScript中的原型链与继承机制
JavaScript作为一种灵活而强大的编程语言,其独特的原型链与继承机制是其核心特性之一。本文将深入探讨JavaScript中的原型链与继承机制,从基础概念到实际应用,帮助读者更好地理解和利用JavaScript的继承特性。