變數 – JavaScript 完全手冊(2018版)
小編推薦: ofollow,noindex">掘金是一個面向程式員的高質量技術社群,從 一線大廠經驗分享到前端開發最佳實踐,無論是入門還是進階,來掘金你不會錯過前端開發的任何一個技術乾貨。
注:本文為 《 JavaScript 完全手冊(2018版) 》第8節,你可以檢視該手冊的完整目錄。
變數是分配給識別符號的字面量,因此您可以稍後在程式中引用和使用它。 我們將學習如何使用 JavaScript 宣告一個變數。
JavaScript 變數簡介
變數是分配給識別符號的字面量,因此您可以稍後在程式中引用和使用它。
JavaScript 中的變數沒有附加任何型別。 將特定字面量型別分配給變數後,您可以稍後重新分配該變數,以持有任何其他型別,而不會出現型別錯誤或任何問題。
這就是 JavaScript 有時被稱為 “無型別” 的原因。
必須先宣告變數才能使用它。 有3種方法可以做到:使用 var
, let
或 const
。 這三種方式在以後如何與變數進行互動方面有所不同。
使用var
在 ES2015 之前, var
是唯一可用於定義變數的構造。
var a = 0
如果您忘記新增 var
,您將為未宣告的變數分配值,結果可能會有所不同。
在現代環境中,啟用嚴格模式後,您將收到錯誤。 在較舊的環境中(或禁用嚴格模式),這將簡單地初始化變數並將其分配給全域性(global)物件,在瀏覽器中,全域性物件是 window
,在 Node.js 中,全域性物件是 global
。
如果在宣告變數時沒有初始化變數,則在為其賦值之前,它將具有 undefined
(未定義) 的值。
var a //typeof a === 'undefined'
您可以多次重新宣告變數,以覆蓋它:
var a = 1 var a = 2
您還可以在同一語句中一次性宣告多個變數:
var a = 1, b = 2
作用域是程式碼中變數的可見性。
使用任何函式外部的 var
初始化的變數將分配給全域性物件,具有全域性作用域並且是任何地方可見。在函式內部用 var
初始化的變數,被賦值變數的作用域是該函式,它被稱為 local(本地)作用域 或 函式作用域,只在函式內可見,就像函式引數一樣。
函式中定義與全域性變數名稱的任何變數,可見性優先於全域性變數,並將全域性變數隱藏。
重要的是要理解一個 block(塊)(由一對花括號標識)沒有定義新的作用域。只有在建立函式時才會建立新作用域,因為 var
沒有塊作用域,而是函式作用域。
在函式內部,其中定義的任何變數在所有函式程式碼中都是可見的,即使變數是在函式末尾宣告的,它仍然可以在開頭引用,因為 JavaScript 在執行程式碼之前實際上將所有變數都移到了頂層(被稱為 hoisting (提升) )。為避免混淆,請始終在函式開頭宣告變數。
作用域對於新手來說很容易混淆,你可以檢視 深入理解JavaScript中的作用域和上下文 和 例項分析 JavaScript 作用域 來深入理解作用域。另外 Hoisting(提升) 這個詞是用來解釋 變數 和 函式宣告 是如何被提升到 函式或全域性 作用域頂部的。你在任何的 JavaScript 文件中找不到這個術語,我們說的 Hoisting(提升) 只是使用了其字面含義來做個比喻。如果你已經對 JavaScript 作用域工作原理有基本的瞭解,那麼更深入的瞭解 JavaScript 中的 Hoisting (變數提升和函式宣告提升) 有助於你建立更強大的基礎知識。
使用 let
let
是 ES2015 中引入的新功能,它本質上是 var
的塊作用域版本。 它的作用域僅限於定義它的 block(塊)(由一對花括號標識),語句或表示式,以及所有包含的內部塊。
現代 JavaScript 開發人員可能會選擇僅使用 let
並完全放棄使用 var
。
let
可以在任何函式之外定義 – 與 var
相反 – let
不會建立全域性變數。
使用 const
用 var
或 let
宣告的變數可以稍後在程式中更改,然後重新分配。 初始化 const
後,其值永遠不會再次更改,並且不能重新分配給不同的值。
const a = 'test'
我們不能為 a
常量指定不同的字面量。然而,如果 a
是一個提供方法的物件,那麼我們可以更改 a
內容 。
const
不提供不可變性(immutability),只是確保不能更改引用。
const
具有塊範圍,與 let
相同。
現代 JavaScript 開發人員可能會選擇始終將 const
用於不需要在程式中稍後重新分配的變數。
為什麼? 因為我們應該始終使用最簡單的結構,以避免在未來發生錯誤。