技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

JavaScript加不加分号有什么不同?

作者:admin    时间:2022-7-11 15:45:5    浏览:

在JavaScript编程中,按照编程习惯,你可能会在每个句末加上一个分号(;),但是我们又发现,现在很多程序根本就不再使用分号了,句末直接为空(什么符号都不写),并且也不影响程序的正常运行。所以JavaScript加不加分号似乎没有什么不同。不过如果深入研究,JavaScript加不加分号并不完全相同,在某些情况下,是必须添加分号的。

至于加不加分号关键点则需要了解分号对于JavaScript 的影响。

 JavaScript加不加分号有什么不同

立即函数与分号的关系

下面程序的运行预期为:

  1. 声明 a 的值为1
  2. 执行立即函数
  3. 在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. 无论如何都加入分号,自行决定程序代码的分段。
  2. 谨记「不会」自动加入分号的规则,当不会自动插入分号时则手动加入。

不会自动加入分号的规则

以下整理各种「不会」自动加入分号的规则:

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() { })()

结论

不加入分号可以让程序看起来更干净、精简(对于习惯加入分号的开发者可能并不这样认为),且在大部分正确的分段下并不会出现错误,仅有少部分的语句会出现执行上的错误(很少,大多都可避免),因此许多开发者也会选择不加入分号。

而加入分号会让人觉得代码分段分明,可读性更强,所以很多人喜欢这样的写代码习惯。

至于选择何种,只要清楚运行上的限制,其实并无什么不同。

标签: 分号  
相关文章
    x
    • 站长推荐
    /* 左侧显示文章内容目录 */