JS代码中加分号和不加分号有什么区别
了解JS代码中加分号和不加分号有什么区别?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
在绵竹等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站设计 网站设计制作按需网站制作,公司网站建设,企业网站建设,品牌网站设计,全网营销推广,成都外贸网站建设公司,绵竹网站建设费用合理。
这个问题在很多文章中都讨论过,在 ESlint 规范中也因为加不加分号而分为两大阵营,到于加不加分号,关键是需要了解分号对于 JavaScript 的影响,开始之前可以先看看下面这道面试题:
请问这段代码是否能够正常运行?
var a = 1 (function() { console.log(2) })()
如果运行这段代码,会出现下面的错误:
Uncaught TypeError: 1 is not a function
什么鬼!1 is not a function
?我们没有打算运行数字 1,为什么说数字 1 不是函数,这种错误是很难找到原因的,经常会在出问题的代码行上打转。这个错误必然是上吗的代码在运行时被看作是同一行,其概念如下:
var a = 1(function() { /* */ })()
因此立即函数的 ()
被附加在 1 上,这是一个调用函数的语法,所以会产生 1 is not a function
的错误,想要避免这个错误就需要使用分号:
var a = 1 // 随便把分号放在哪里,只要能隔开就行 ;(function() { console.log(2) })()
ASI 自动加入分号
ASI是 “Automatic Semicolon Insertion” 的缩写,在运行时会往有些折行的代码中自动插入分号,这个机制可以使部分代码在没有加入分号时也能正常运行,比如下面的例子:
var b = 1 ++b console.log('b', b)
由于代码中的 ++
属于一元表达式,它只能在表达式的左边或右边放置变量,如果没有 ASI 的机制,代码会被转换为 var b = 1 ++ b
这样的错误语句。不过好在有 ASI,在实际运行时会自动被加入分号,也就不会出现上面的错误。
var b = 1; ++b; console.log('b', b); // 2
return 与分号的关系
再来看一个例子,下面的代码在 return
的后面空一行后再写要返回的值,那么问运行结果是什么呢?
function fn() { return '小明' } console.log(fn())
这段程序代码因为 ASI 的修正,return
的后面会被加上一个分号,所以 return
与预期返回的值被分开了,结果 return
的内容为空值,最终的结果也只能是 undefined
。
function fn() { return; '小明'; } console.log(fn()); // undefined
到底应该怎样处理分号
本来 ASI 是出于一片好心,用来修正没有加入分号的代码片段,但偏偏在有的地方并没有发挥它的作用(例如本文一开始所介绍的立即函数),导致代码出现了错误;甚至有些代码不会出错,但会使你的代码执行结果和预期相差万里。
解决 ASI 问题的方式如下:
- 无论如何都要加上分号,完全由自己决定代码的分割
- 牢记不会自动加入分号的规则,当不会自动插入分号时,则手动加入
不会被自动加入分号的规则
下面时各种不会自动加入分号的规则:
- 新行的代码是从
(
、[
、/
字符开始的,这类情况一般会直接出现Uncaught TypeError
从而导致代码无法运行。
var a = 1 var b = a (a + b).toString() var a = 1 [1,2,3].forEach(bar) (function() { })() (function() { })() var a = 1 var b = a /test/.test(b)
- 新行以
+
,-
,*
,%
开始,这类情况大多会影响运算结果,所以应该合并为一行。
var a = 2 var b = a +a
- 新行以
,
或.
开始,这种用法经常会出现,主要是为了避免代码过长而加入的分隔,这种情况并不会影响运行,如果善用的话会使代码更容易阅读。
var a = 2 var b = a .toString() console.log(typeof b) var a = 1 ,b = 2 // b 同样会被 var 声明
如果遇到需要加入分号的情况,除了可以在语句的末尾加入分号外,也可以把分号加在“不会自动加入分号”的最前方,例如 ()
本身不会自动加入分号,在有这种需求时可以将 ;
加到前面(ESLint Standard JS 规范就用这个方法避免错误)。
// 运行错误 (function() { })() (function() { })() // 正确 ;(function() { })() ;(function() { })()
感谢各位的阅读!看完上述内容,你们对JS代码中加分号和不加分号有什么区别大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注创新互联行业资讯频道。
分享题目:JS代码中加分号和不加分号有什么区别
地址分享:http://ybzwz.com/article/jpdhie.html