JavaScript加不加分号有什么不同?
作者:admin 时间:2022-7-11 15:45:5 浏览:在JavaScript编程中,按照编程习惯,你可能会在每个句末加上一个分号(;
),但是我们又发现,现在很多程序根本就不再使用分号了,句末直接为空(什么符号都不写),并且也不影响程序的正常运行。所以JavaScript加不加分号似乎没有什么不同。不过如果深入研究,JavaScript加不加分号并不完全相同,在某些情况下,是必须添加分号的。
至于加不加分号关键点则需要了解分号对于JavaScript 的影响。
立即函数与分号的关系
下面程序的运行预期为:
- 声明
a
的值为1 - 执行立即函数
- 在console中输出2
请问这段程序运行是否正确?
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)
})()
return 与分号的关系
再来看一个片段,以下程序中在return
的后方空一行后再回传值,请问运行结果是什么呢?
function fn() {
return
'小明'
}
console.log(fn())
这段程序在 return
后方会被加上一个分号,也因为如此,return
与预期回传的值被分了开来,所以return
的内容为空值,最终函数也仅能接收到 undefined
的结果。
function fn() {
return;
'小明';
}
console.log(fn()); // undefined
所以,分号到底要怎么处理呢?
ASI「Automatic Semicolon Insertion」自动插入分号, 是修正没有加入分号的片段代码,但偏偏有些地方没有发挥其用途(如本篇一开始所介绍到的立即函数),导致程序出现了错误;甚至有些程序不会出错,但会让你的程序运行结果不如预期。
要解决ASI 的问题,解决方式如下:
- 无论如何都加入分号,自行决定程序代码的分段。
- 谨记「不会」自动加入分号的规则,当不会自动插入分号时则手动加入。
不会自动加入分号的规则
以下整理各种「不会」自动加入分号的规则:
1、新的一行是(
、[
、/
开始,这类型通常会直接出现「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)
2、新的一行以 +
、-
、*
、%
作开始,这类型大多数会影响运算结果,建议合并为一行写。
var a = 2
var b = a
+a
3、新的一行以,
、.
作开始,这类型在实战中很常会运用,主要是避免程序代码过长所加入的分段,并不会影响运行,多加善用可使程序代码更易于阅读。
var a = 2
var b = a
.toString()
console.log(typeof b)
var a = 1
,b = 2 // b 一样会被 var 声明
因此,遇到以上的标点符号前方加入分号也是解决办法。
如果需要加入分号的状况,除了在语句的末端加入分号外,也可将分号改在「不会自动加入分号」的最前方,如 ()
本身不会自动加入分号,当有此需求时可以将 ;
加入至前方以避免错误。
// 执行错误
(function() { })()
(function() { })()
// 正确
;(function() { })()
;(function() { })()
结论
不加入分号可以让程序看起来更干净、精简(对于习惯加入分号的开发者可能并不这样认为),且在大部分正确的分段下并不会出现错误,仅有少部分的语句会出现执行上的错误(很少,大多都可避免),因此许多开发者也会选择不加入分号。
而加入分号会让人觉得代码分段分明,可读性更强,所以很多人喜欢这样的写代码习惯。
至于选择何种,只要清楚运行上的限制,其实并无什么不同。
标签: 分号
- 站长推荐