技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運營

贊助商

分類目錄

贊助商

最新文章

搜索

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

作者:admin    時間:2022-7-11 15:45:5    瀏覽:

在JavaScript編程中,按照編程習(xí)慣,你可能會在每個句末加上一個分號(;),但是我們又發(fā)現(xiàn),現(xiàn)在很多程序根本就不再使用分號了,句末直接為空(什么符號都不寫),并且也不影響程序的正常運行。所以JavaScript加不加分號似乎沒有什么不同。不過如果深入研究,JavaScript加不加分號并不完全相同,在某些情況下,是必須添加分號的。

至于加不加分號關(guān)鍵點則需要了解分號對于JavaScript 的影響。

 JavaScript加不加分號有什么不同

立即函數(shù)與分號的關(guān)系

下面程序的運行預(yù)期為:

  1. 聲明 a 的值為1
  2. 執(zhí)行立即函數(shù)
  3. 在console中輸出2

請問這段程序運行是否正確?

var a = 1
(function() {
  console.log(2)
})()

.
.
.
.
如果你嘗試運行這段程序,則會出現(xiàn)此錯誤:

Uncaught TypeError: 1 is not a function

什么?1 is not a function?我們沒有打算運行數(shù)字1,為何要說數(shù)字1 不是函數(shù),這種錯誤很難查找到原因,常常會在錯誤的行數(shù)上打轉(zhuǎn)。這個錯誤主要原因是上述程序運行時被視為同一行,概念如下:

var a = 1(function() { /* */ })()

因此立即函式的 () 附加在1 上,這是一個調(diào)用函數(shù)的語法,所以會造成 1 is not a function 的錯誤,如果要避免此錯誤就需要使用分號將其隔開:

var a = 1; // 用分號隔開就對了
(function() {
  console.log(2)
})()

return 與分號的關(guān)系

再來看一個片段,以下程序中在return 的后方空一行后再回傳值,請問運行結(jié)果是什么呢?

function fn() {
  return 
  '小明'
}
console.log(fn())

這段程序在 return 后方會被加上一個分號,也因為如此,return 與預(yù)期回傳的值被分了開來,所以return 的內(nèi)容為空值,最終函數(shù)也僅能接收到 undefined 的結(jié)果。

function fn() {
  return;
  '小明';
}
console.log(fn()); // undefined

所以,分號到底要怎么處理呢?

ASI「Automatic Semicolon Insertion」自動插入分號, 是修正沒有加入分號的片段代碼,但偏偏有些地方?jīng)]有發(fā)揮其用途(如本篇一開始所介紹到的立即函數(shù)),導(dǎo)致程序出現(xiàn)了錯誤;甚至有些程序不會出錯,但會讓你的程序運行結(jié)果不如預(yù)期。

要解決ASI 的問題,解決方式如下:

  1. 無論如何都加入分號,自行決定程序代碼的分段。
  2. 謹(jǐn)記「不會」自動加入分號的規(guī)則,當(dāng)不會自動插入分號時則手動加入。

不會自動加入分號的規(guī)則

以下整理各種「不會」自動加入分號的規(guī)則:

1、新的一行是(、[、/開始,這類型通常會直接出現(xiàn)「Uncaught TypeError」導(dǎo)致程序無法運行(其后方的程序也會無法運作)。

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、新的一行以 +、-*、% 作開始,這類型大多數(shù)會影響運算結(jié)果,建議合并為一行寫。

var a = 2
var b = a
+a

3、新的一行以,、.作開始,這類型在實戰(zhàn)中很常會運用,主要是避免程序代碼過長所加入的分段,并不會影響運行,多加善用可使程序代碼更易于閱讀。

var a = 2
var b = a
  .toString()
console.log(typeof b)
 
var a = 1
,b = 2 // b 一樣會被 var 聲明

因此,遇到以上的標(biāo)點符號前方加入分號也是解決辦法。

如果需要加入分號的狀況,除了在語句的末端加入分號外,也可將分號改在「不會自動加入分號」的最前方,如 () 本身不會自動加入分號,當(dāng)有此需求時可以將 ; 加入至前方以避免錯誤。

// 執(zhí)行錯誤
(function() { })()
(function() { })()
 
// 正確
;(function() { })()
;(function() { })()

結(jié)論

不加入分號可以讓程序看起來更干凈、精簡(對于習(xí)慣加入分號的開發(fā)者可能并不這樣認(rèn)為),且在大部分正確的分段下并不會出現(xiàn)錯誤,僅有少部分的語句會出現(xiàn)執(zhí)行上的錯誤(很少,大多都可避免),因此許多開發(fā)者也會選擇不加入分號。

而加入分號會讓人覺得代碼分段分明,可讀性更強,所以很多人喜歡這樣的寫代碼習(xí)慣。

至于選擇何種,只要清楚運行上的限制,其實并無什么不同。

標(biāo)簽: 分號  
相關(guān)文章
    x
    • 站長推薦
    /* 左側(cè)顯示文章內(nèi)容目錄 */