国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

白話es6系列二:你真的會聲明變量嗎

maybe_009 / 1755人閱讀

摘要:新增了二個聲明變量的關(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

使用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

相關(guān)文章

  • 深入理解JavaScript

    摘要:深入之繼承的多種方式和優(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)。 但是注意: 這篇文章更像是筆記,哎,再讓我...

    myeveryheart 評論0 收藏0
  • 白話es6系列一:Array.of()和Array.from()

    摘要:更重要的是,代碼意圖也直觀數(shù)組長度,每一項按照約定的規(guī)則進(jìn)行初始化。上面代碼創(chuàng)建了一個長度為的數(shù)組其中的項為數(shù)字。的強(qiáng)大不止于此,它還能接受一個映射函數(shù)上面代碼中,被直接傳遞給方法,從而將它包含的值轉(zhuǎn)換成了數(shù)組。 es6新增了二種方法:Array.of()和Array.from(),它們有什么用途呢?在平時的開發(fā)中能給我們帶來什么方便呢?本篇將從一個創(chuàng)建數(shù)組的小問題開始,逐步揭開它們的...

    newtrek 評論0 收藏0
  • 真的懂switch?聊聊switch語句中的塊級作用域

    摘要:最近在代碼中不小心不規(guī)范的,在里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下語句中的塊級作用域。而與無關(guān)每一個并不會構(gòu)成一個獨(dú)立的塊級作用域。 ??最近在代碼中不小心不規(guī)范的,在switch里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下switch語句中的塊級作用域。 switch語句中的塊級作用域 switch語句中的塊級作用域可能存在的問題 規(guī)范和檢...

    zone 評論0 收藏0
  • 真的懂switch?聊聊switch語句中的塊級作用域

    摘要:最近在代碼中不小心不規(guī)范的,在里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下語句中的塊級作用域。而與無關(guān)每一個并不會構(gòu)成一個獨(dú)立的塊級作用域。 ??最近在代碼中不小心不規(guī)范的,在switch里面定義了塊級變量,導(dǎo)致頁面在某些瀏覽器中出錯,本文討論以下switch語句中的塊級作用域。 switch語句中的塊級作用域 switch語句中的塊級作用域可能存在的問題 規(guī)范和檢...

    pkwenda 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<