摘要:新增了二個聲明變量的關(guān)鍵字,和,再加上之前的,這樣聲明變量就有三個關(guān)鍵字了,大有三國鼎立之勢。當(dāng)?shù)闹禐闀r,該變量不會被聲明并初始化。如果上面的那個循環(huán)中用聲明變量,那么循環(huán)完了,變量也就隨時銷毀,不能再被訪問。
ES6新增了二個聲明變量的關(guān)鍵字,let和const,再加上ES6之前的var,這樣聲明變量就有三個關(guān)鍵字了,大有三國鼎立之勢。那到底用哪個來聲明變量呢?var
首先,得說說var的特殊行為,變量提升,來看一個例子:
var condition = false if (condition) { var value = "red" console.log(value) } else { // value 在這里可以訪問,值為undefined console.log(value) }
在上面代碼中,即使condition為false,變量value也是存在的,相當(dāng)于如下定義:
var condition = false var value if (condition) { value = "red" console.log(value) } else { // value 在這里可以訪問,值為undefined console.log(value) }
就是說,使用var關(guān)鍵字聲明的變量,無論其實(shí)際聲明位置在何處,都會被視為聲明于所在函數(shù)的頂部(如果聲明不在函數(shù)內(nèi),則視為在全局作用域的頂部),這就是變量提升。
對這種特殊行為,如果你不理解,就很可能導(dǎo)致bug。我們來看一個循環(huán)的例子:
for (var i = 0; i < 6; i++) { console.log(i) } // i 在這里依舊可以訪問 console.log(i) // 6
for循環(huán)完了,已經(jīng)不再需要變量i,但是它依舊可以被訪問。
所以,ES6引入了塊級作用域,讓變量的生命周期更加可控,于是,let出現(xiàn)了。
塊級聲明-let我們來看看用let聲明的代碼:
var condition = false if (condition) { let value = "red" console.log(value) } else { // value 在這里不可以訪問,會報錯 console.log(value) }
由于變量value聲明使用的是let,所以就沒有被提升到函數(shù)定義的頂部,變量value在if代碼塊外部是無法訪問的。當(dāng)condition的值為false 時,該變量不會被聲明并初始化。
如果上面的那個for循環(huán)中用let聲明變量i,那么循環(huán)完了,變量i也就隨時銷毀,不能再被訪問。
使用const聲明的變量會被認(rèn)為是常量(constant),意味著它們的值在被設(shè)置完成后就不能再被改變,常量聲明與let聲明一樣,都是塊級聲明。
來看個小例子:
const num = 12 num = 13 // 報錯 const obj = { name: "moddx", age: 28 }; obj.age = 26 // 正常
上面用const聲明了一個變量num,當(dāng)重新給其賦值時會報錯,而變量obj初始化之后,再將其age屬性改變,不會報錯,因為對象是一個引用類型,其指向的內(nèi)存中的地址是沒有被改變的,除非將其重新賦值給一個新對象,就會報錯,如下:
const obj = { name: "moddx", age: 28 }; obj = { name: "foo" } // 報錯總結(jié)
說了這么多,那到底時候用什么關(guān)鍵字來聲明呢?就沒有一個標(biāo)準(zhǔn)或者約定俗成的習(xí)慣嗎?
目前,被廣泛認(rèn)可的變量聲明方式是:默認(rèn)情況下應(yīng)當(dāng)使用const,當(dāng)你確定聲明的變量需要改變時,用let聲明。其依據(jù)是大部分變量在初始化之后都不應(yīng)當(dāng)被修改,因為預(yù)期外的改動是bug的源頭之一。(那var呢?好吧,基本被拋棄了)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102676.html
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:更重要的是,代碼意圖也直觀數(shù)組長度,每一項按照約定的規(guī)則進(jìn)行初始化。上面代碼創(chuàng)建了一個長度為的數(shù)組其中的項為數(shù)字。的強(qiáng)大不止于此,它還能接受一個映射函數(shù)上面代碼中,被直接傳遞給方法,從而將它包含的值轉(zhuǎn)換成了數(shù)組。 es6新增了二種方法:Array.of()和Array.from(),它們有什么用途呢?在平時的開發(fā)中能給我們帶來什么方便呢?本篇將從一個創(chuàng)建數(shù)組的小問題開始,逐步揭開它們的...
摘要:最近在代碼中不小心不規(guī)范的,在里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下語句中的塊級作用域。而與無關(guān)每一個并不會構(gòu)成一個獨(dú)立的塊級作用域。 ??最近在代碼中不小心不規(guī)范的,在switch里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下switch語句中的塊級作用域。 switch語句中的塊級作用域 switch語句中的塊級作用域可能存在的問題 規(guī)范和檢...
摘要:最近在代碼中不小心不規(guī)范的,在里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下語句中的塊級作用域。而與無關(guān)每一個并不會構(gòu)成一個獨(dú)立的塊級作用域。 ??最近在代碼中不小心不規(guī)范的,在switch里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下switch語句中的塊級作用域。 switch語句中的塊級作用域 switch語句中的塊級作用域可能存在的問題 規(guī)范和檢...
閱讀 1824·2019-08-30 15:55
閱讀 1017·2019-08-26 11:57
閱讀 521·2019-08-26 11:29
閱讀 3366·2019-08-26 10:49
閱讀 1916·2019-08-23 18:40
閱讀 1756·2019-08-23 16:04
閱讀 3115·2019-08-23 11:01
閱讀 2283·2019-08-23 10:56