ES6中的let與const

今天學(xué)習(xí)了ES6新增語法中的let與const命令的基本用法和一些特性九妈,這篇博客用以對這兩個(gè)命令的用法的一些總結(jié)反砌。

在寫let與const之前,首先要明白JS中的塊級作用域萌朱。

一宴树、JS中的塊級作用域

  • ES6之前JS不支持塊級作用域
    在ES6之前,JS是沒有塊級作用域這個(gè)概念的晶疼,只有全局作用域和函數(shù)內(nèi)的局部作用域酒贬,比如在下面的代碼中,for循環(huán)內(nèi)定義的變量 i 實(shí)際上處于全局作用域中翠霍,所以在循環(huán)的外部是可以調(diào)用變量 i 的锭吨,這個(gè) i 就有可能造成變量的污染
for(var i = 0; i < 5; i++){
}
console.log(i) // 5
  • 出現(xiàn)
    ES6的擴(kuò)展為JS帶來了新的變量聲明方法,其中的let從實(shí)際上為JS新增了塊級作用域的功能寒匙,使用該命令聲明的變量只能在let命令所在的代碼塊中使用零如。

二、let命令

  • 與var命令的對比,以及l(fā)et的一些特性
    1.let聲明的變量只能在let命令所在代碼區(qū)塊中生效
// var
for(var i = 0; i < 5; i++){
}
console.log(i) // 5
// let
for(let i = 0; i < 5; i++){      // 這個(gè)i只能在這個(gè)for循環(huán)內(nèi)使用
}
console.log(i) // 報(bào)錯(cuò):i is not defined

2.let不存在變量提升

console.log(a)   // undefined
console.log(b)   // 報(bào)錯(cuò):b未定義
var a = 1
let b = 1

3.因?yàn)閘et不存在變量提升埠况,所以會(huì)有暫時(shí)性死區(qū)
什么是暫時(shí)性死區(qū)?
暫時(shí)性死區(qū)就是在這個(gè)區(qū)塊中的變量未聲明之前棵癣,對該區(qū)塊中的變量的一切調(diào)用都會(huì)報(bào)錯(cuò)

a = 1
let a = 2  
// 以上代碼會(huì)報(bào)錯(cuò)
a = 1
{let a = 2}
// 以上代碼不會(huì)報(bào)錯(cuò)辕翰,因?yàn)槁暶髯兞康膮^(qū)塊不一  

4.let聲明的變量不能重復(fù)進(jìn)行聲明

let a = 1
var a = 1 // 報(bào)錯(cuò) a已經(jīng)被聲明
const a = 1 // 報(bào)錯(cuò) a已經(jīng)被聲明
  • let的使用實(shí)例
    因?yàn)閘et命令的出現(xiàn),所以JS有了塊級作用域狈谊,原本因?yàn)樽饔糜騿栴}導(dǎo)致的閉包問題也可以使用let嗎喜命,清零進(jìn)行解決,比如以下經(jīng)典閉包代碼會(huì)一次性輸出5個(gè)5河劝,但需求是輸出01234
for(var i = 0; i < 5; i++){
    setTimeout(function(){
        console.log(i)
    }, 1000)
}

1.ES6之前的解決辦法壁榕,使用一個(gè)變量對 i 的值進(jìn)行暫存

for(var i = 0; i < 5; i++){
    (function(e){
        setTimeout(function(){
            console.log(e)
        }, 1000)        
    })(i)
}

2.出現(xiàn)let后的解決辦法

for(let i = 0; i < 5; i++){
    setTimeout(function(){
        console.log(i)
    }, 1000)
}
  • 關(guān)于for循環(huán)作用域的問題
    在for循環(huán)中實(shí)際上是有兩個(gè)作用域的,條件設(shè)置的圓括號()內(nèi)是一個(gè)父作用域赎瞎,而代碼塊大括號{}中是一個(gè)子作用域牌里,比如下面代碼可以進(jìn)行區(qū)分
for(let i = 0; i < 5; i++){
    let i = 8
    console.log(i)
}
// 輸出結(jié)果是5個(gè)8

三、const命令

與let命令的用法類似务甥,const命令也是用來聲明一個(gè)變量牡辽,同時(shí)也只能在聲明的塊級作用域中進(jìn)行使用,但不同的是const聲明變量后敞临,這個(gè)變量就變成了一個(gè)不能進(jìn)行更改的常量态辛。

  • const命令的特性
    1.聲明的時(shí)候就必須馬上初始化,否則報(bào)錯(cuò)
    如下代碼:
const a;   // 報(bào)錯(cuò)  未初始化
const a = 1 // 不報(bào)錯(cuò)

2.聲明的值不能改變挺尿,不能重新進(jìn)行賦值

const a = 1
a = 2         // 報(bào)錯(cuò)   a已經(jīng)被聲明過

3.與let一樣不存在變量提升

console.log(a)  // 報(bào)錯(cuò) a未聲明
const a = 1     

4.與let一樣不可重復(fù)進(jìn)行聲明

const a = 1
var a = 1 // 報(bào)錯(cuò) a已經(jīng)被聲明
let a = 1 // 報(bào)錯(cuò) a已經(jīng)被聲明
  • 注意點(diǎn)
    1.const聲明的變量的值不能改變實(shí)質(zhì)上是變量指向的內(nèi)存地址不能改變奏黑,因此會(huì)有以下兩種情況
    • 值為簡單類型:
      值保存在變量指向的內(nèi)存地址上。
    • 值為復(fù)雜類型:
      例如對象:值也保存在變量指向的內(nèi)存地址上编矾,但是不同的是熟史,這個(gè)內(nèi)存地址實(shí)際上是一個(gè)指針,指向這個(gè)對象窄俏,那么在實(shí)際上是可以對這個(gè)對象內(nèi)的屬性進(jìn)行賦值的以故,如下代碼:
    const a = {b:1}
    console.log(a.b)  // 1
    a.b = 2
    console.log(a.b)  // 2

2.針對上面的問題,如果想讓對象的屬性和值絕對不變裆操,可以使用Object.freeze方法

    const a =Object.freeze({b:1})
    console.log(a.b)  // 1
    a.b = 2
    console.log(a.b)  // 1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怒详,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踪区,更是在濱河造成了極大的恐慌昆烁,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缎岗,死亡現(xiàn)場離奇詭異静尼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門鼠渺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸭巴,“玉大人,你說我怎么就攤上這事拦盹【樽妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵普舆,是天一觀的道長恬口。 經(jīng)常有香客問我,道長沼侣,這世上最難降的妖魔是什么祖能? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮蛾洛,結(jié)果婚禮上养铸,老公的妹妹穿的比我還像新娘。我一直安慰自己轧膘,他們只是感情好揭厚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扶供,像睡著了一般筛圆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椿浓,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天太援,我揣著相機(jī)與錄音,去河邊找鬼扳碍。 笑死提岔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笋敞。 我是一名探鬼主播碱蒙,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夯巷!你這毒婦竟也來了赛惩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤趁餐,失蹤者是張志新(化名)和其女友劉穎喷兼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體后雷,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡季惯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年吠各,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勉抓。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贾漏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藕筋,到底是詐尸還是另有隱情纵散,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布念逞,位于F島的核電站,受9級特大地震影響边翁,放射性物質(zhì)發(fā)生泄漏翎承。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一符匾、第九天 我趴在偏房一處隱蔽的房頂上張望叨咖。 院中可真熱鬧,春花似錦啊胶、人聲如沸甸各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趣倾。三九已至豆拨,卻和暖如春超陆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黄刚。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工黔漂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诫尽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓炬守,卻偏偏與公主長得像牧嫉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子减途,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容