ES6 -- let 與 const 變量

回顧:JavaScript 的 var 聲明變量

1. 允許重復的變量聲明:導致數(shù)據(jù)被覆蓋酬滤。

var a = 1;

function print() {
    console.log(a);
}

// 假設這里有一千行代碼家淤,重復的變量可能會導致變量被更改

var a = 2;

print(); // a = 2

2. 變量提升:怪異的數(shù)據(jù)訪問、閉包問題。

怪異的數(shù)據(jù)訪問:

if(Math.random() < 0.5) {
    var a = "abc";
    console.log(a);
}else{
    console.log(a)
}

console.log(a);

// 邏輯為:如果隨機數(shù)小于0.5威始,則聲明變量a,賦值為abc肤寝,輸出a当辐;如果隨機數(shù)不小于0.5,則輸出a鲤看。

// 變量提升:先聲明變量a缘揪,如果隨機數(shù)小于0.5,賦值為abc义桂,輸出a找筝;否則輸出a。

閉包問題:

<div id="divBtns"></div>

var div = document.getElementById("divBtns");

for(var i = 1; i <= 10; i ++) {
    var btn = document.createElement("button");
    btn.innerHTML = "按鈕" + i;
    div.appendChild(btn);

    // 當btn生成后慷吊,循環(huán)結束袖裕,結束之后才開始點擊事件
    btn.onclick = function() {
        console.log(i); // 使用同一個變量 i
    }
}

// 循環(huán)結束后 i = 1

3. 全局變量掛載到全局對象:全局對象成員污染問題。

var abc = "123";
console.log(window.abc); // 會導致window對象的成員被覆蓋

let 聲明變量

ES6不僅引入let關鍵字用于解決變量聲明的問題溉瓶,同時引入了塊級作用域的概念急鳄。

let 聲明的變量只在 let 命令所在的代碼塊內(nèi)有效。

塊級作用域:代碼執(zhí)行時遇到花括號堰酿,會創(chuàng)建一個塊級作用域疾宏,花括號結束,銷毀塊級作用域触创。

let a = 123; // 全局作用域
{
    // 塊級作用域
    let a = 456;
    console.log(a); // 456
}
console.log(a); // 123

1. let聲明的變量不會掛載到全局對象坎藐。

let a = 123;
console.log(window.a); // undefined

2. let聲明的變量,不允許當前作用域范圍內(nèi)重復聲明哼绑。在塊級作用域中用let定義的變量岩馍,在作用域外不能訪問。

let a = 123;
let a = 456; // 檢查到當前作用域(全局作用域)已經(jīng)聲明了a抖韩,會報錯
let a = 123; // 全局作用域
{
    // 塊級作用域
    let a = 456;
    console.log(a); // 456
}
console.log(a); // 123

3. 使用let不會有變量提升蛀恩,因此不能在定義let變量之前,使用let變量帽蝶。

if(Math.random() < 0.5) {
    let a = "abc"; // 定義在當前塊級作用域
    console.log(a); // 當前塊級作用域的a赦肋。
}else{
    // 這是另一個塊級作用域,該作用域找不到a
    console.log(a)
}

console.log(a);

底層實現(xiàn)上励稳,let聲明的變量實際上也會有提升佃乘,但是,提升后會將其放入到“暫時性死區(qū)”驹尼,如果訪問的變量位于暫時性死區(qū)趣避,則會報錯“Cannot access 'a' before initialization”。當代碼運行到該變量的聲明語句時新翎,會將其從暫時性死區(qū)中移除程帕。

console.log(a); // Cannot access 'a' before initialization
let a = 123;

4. 在循環(huán)中住练,用let聲明的循環(huán)變量,會特殊處理愁拭,每次進入循環(huán)體讲逛,都會開啟一個新的作用域,并且將循環(huán)變量綁定到該作用域(每次循環(huán)岭埠,使用的是一個全新的變量)盏混。在循環(huán)中,使用let聲明的循環(huán)變量惜论,在循環(huán)結束后會被銷毀许赃。

<div id="divBtns"></div>
<script>
    let div = document.getElementById("divBtns");

    for(let i = 1; i <= 10; i ++) {
        let button = document.createElement("button");
        button.innerHTML = "按鈕" + i;
        div.appendChild(button);
        button.onclick = function() {
            console.log(i); // 使用的是當前作用域的 i 
        }
    }
</script>

const聲明常量

const 和 let 完全相同,僅在于用const聲明的變量馆类,必須在聲明時賦值混聊,而且不可以重新賦值。

const a; // 未賦值會報錯:“SyntaxError: Missing initializer in const declaration”


const a = 1;
    a = 2; // 重新賦值會報錯:“TypeError: Assignment to constant variable.”

實際上乾巧,在開發(fā)中句喜,應該盡量使用const來聲明變量,以保證變量的值不會被隨意篡改卧抗。原因如下:

  1. 根據(jù)經(jīng)驗藤滥,開發(fā)中的很多變量,都是不會更改社裆,也不應該更改的。
  2. 后來的很多框架或是第三方js庫向图,都是要求數(shù)據(jù)不可變泳秀,使用常量可以在一定程度上保證這一點。

注意細節(jié):

1. 常量不可變榄攀,是指聲明的常量的內(nèi)存空間不可變嗜傅,并不保證內(nèi)存空間中的地址指向的其他空間不可變。

const obj = {a: 2};
    obj.a = 3;
    obj.x = 4;
    console.log(obj); // {a: 3, x: 4}

2. 常量的命名

特殊的常量:該常量從字面意義上檩赢,一定是不可變的吕嘀,比如圓周率、月距地或其他一些絕不可能變化的配置贞瞒。通常偶房,該常量的名稱全部使用大寫,多個單詞之間使用下劃線分割军浆。

普通的常量:使用和之間一樣的命名即可棕洋。

3. 在for循環(huán)中,循環(huán)變量不可以使用常量乒融。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掰盘,一起剝皮案震驚了整個濱河市摄悯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愧捕,老刑警劉巖奢驯,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異次绘,居然都是意外死亡叨橱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門断盛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罗洗,“玉大人,你說我怎么就攤上這事钢猛』锊耍” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵命迈,是天一觀的道長贩绕。 經(jīng)常有香客問我,道長壶愤,這世上最難降的妖魔是什么淑倾? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮征椒,結果婚禮上娇哆,老公的妹妹穿的比我還像新娘。我一直安慰自己勃救,他們只是感情好碍讨,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒙秒,像睡著了一般勃黍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晕讲,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天覆获,我揣著相機與錄音,去河邊找鬼瓢省。 笑死弄息,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的净捅。 我是一名探鬼主播疑枯,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛔六!你這毒婦竟也來了荆永?” 一聲冷哼從身側(cè)響起废亭,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎具钥,沒想到半個月后豆村,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡骂删,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年掌动,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宁玫。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡粗恢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欧瘪,到底是詐尸還是另有隱情眷射,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布佛掖,位于F島的核電站妖碉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芥被。R本人自食惡果不足惜欧宜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拴魄。 院中可真熱鬧冗茸,春花似錦、人聲如沸羹铅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽职员。三九已至,卻和暖如春跛溉,著一層夾襖步出監(jiān)牢的瞬間焊切,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工芳室, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留专肪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓堪侯,卻偏偏與公主長得像嚎尤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伍宦,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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