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-08-22 14:39:11

JavaScript中的分号插入机制详细介绍_基础知识的相关文章

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

 这篇文章主要介绍了JavaScript中的分号插入机制详细介绍,本文讲解JavaScript中各种情况下的分号插入机制,需要的朋友可以参考下     仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 代码如下: function square(x) { var n = +x return n * n } 但是却不可以写的像下面代码一样,这样就报错了哦 代码如下: function area(r) {

JavaScript中的运算符种类及其规则介绍_基础知识

JavaScript中的运算符有很多,主要分为算术运算符,等同全同运算符,比较运算符,字符串运算符,逻辑运算符,赋值运算符等.这些运算符都有一些属于自己的运算规则,下面就为大家介绍一下JavaScript中的运算符. 一.JavaScript运算符的种类 1.算术运算符:+ . - .* . / . % . -(一元取反) . ++ . -- 2.等同全同运算符:== . ===. !== . !=== 3.比较运算符:< . > . <= . >= 4.字符串运算符:< .

javascript编码的几个方法详细介绍_基础知识

escape定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 参数 描述 string 必需.要被转义或编码的字符串.   返回值 已编码的 string 的副本.其中某些字符被替换成了十六进制的转义序列. 说明 该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / .其他所有的字符都会被转义序列替换. 提示和注释 提示:可以使用 unescape() 对 escape() 编码的

Javascript 事件冒泡机制详细介绍_基础知识

1. 事件          在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作.          浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2.冒泡机制             什么是冒泡呢?          下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中,气泡会经过不同深度层次的水.        

JavaScript中的分号插入机制

原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 function square(x) { var n = +x return n * n } 但是却不可以写的像下面代码一样,这样就报错了哦 function area(r) { r = +r return Math.PI*r*r }//error   仅在随后的输入标记不能解析时插入 也就是说分号插入是一种错

Javascript中的delete操作符详细介绍_基础知识

一.变量 说到javascript中的delete操作符,还是首先要搞清楚javascript中的变量和属性之间的关系. javascript中,变量和对象属性关系非常微妙,甚至可以很多时候会被等同起来,因为 javascript 在执行脚本之前会创建一个global对象,在浏览器中就是window对象,所有的全局变量都是这个global对象的属性,执行函数时也会创建一个activation对象,所有的局部变量都是这个activation对象的属性.这些可以大家可以去了解一下javascript

深入理解JavaScript系列(17):面向对象编程之概论详细介绍_基础知识

介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基本关系 - 继承)之间的关系是如何,也可以在讨论中使用(我希望将消除之前对于JavaScript中OOP的一些概念歧义). 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/ 概论.范式与思想 在进行E

JavaScript执行顺序详细介绍_基础知识

之前从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序.如果说,JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我们可以直观感觉到这种执行顺序,当然JavaScript代码的执行顺序是比较复杂的,所以在深入JavaScript语言之前也有必要对其进行剖析.1.1  按HTML文档流顺序执行JavaScript代码首先,读者应该清楚,H

javascript 内置对象及常见API详细介绍_基础知识

一. 类与对象    在 JavaScript世界里,关于面向对象第一个要澄清的概念就是类.对象都是由类来定义的,通过类来创建对象就是我们所熟悉的实例化.然而,在 JavaScript中别没有真正的类,对象的定义就是对象自身.而 ECMA-262 干脆把这种妥协的方式称作为对象的调和剂.为了方便理解,我通常把这个发挥类的作用的调和剂称为类.    Javascript内置对象学习 全局属性 Infinity 表示正无穷大的数值 NaN 非数字值 undefined 未定义的值 decodeURI