let、const 和 var 的區(qū)別

let霜威、const 是 ES6 新增的兩個聲明變量的命令谈喳,用法類似于于 var。

塊級作用域

眾所周知戈泼,在 ES5 當中婿禽,只有全局作用域函數作用域。那為什么需要塊級作用域呢矮冬?

  • 場景一:內層同名變量會覆蓋外層變量

    var str = "hello,world!";
    function fun() {
    console.log(str);
    var str = "你好谈宛,世界";
    }
    fun(); // undefined
    
    var str = "hello,world!";
    function fun() {
    console.log(str);
    let str = "你好,世界";
    }
    fun(); //  ReferenceError
    
  • 場景二:循環(huán)變量泄露為全局變量

    for (var i = 0; i < 5; i++) {
    setTimeout(() => {
        console.log(i);
    }, 1000);
    }
    // 5 5 5 5 5
    for (let i = 0; i < 5; i++) {
    setTimeout(() => {
        console.log(i);
    }, 1000);
    }
    // 1 2 3 4 5
    

    在ES5胎署,我們在通常會使用匿名立即執(zhí)行函數解決這類問題

    for (var i = 0; i < 5; i++) {
        (function (i) {
            setTimeout(() => {
                console.log(i);
            }, 1000);
        })(i)
    }
    // 1 2 3 4 5
    

let

let 實際上是 ES6 新增的塊級作用域吆录,和var相比,有以下特征

不存在變量提升

var 聲明的變量會提升到當前作用域的最頂端琼牧,注意只提升聲明恢筝,不提升賦值哀卫。

console.log(str); // undefined
var str = "javascript";
等價于;
var str;
console.log(str);
str = "javascript";

let 不存在變量提升

console.log(str); // ReferenceError
let str = "javascript";

暫時性死區(qū)

只要是 let 聲明的變量會“綁定”到當前作用域,不會受外部影響撬槽,在代碼塊內此改,使用 let 命令聲明變量之前,該變量都是不可用的侄柔。這在語法上共啃,稱為“暫時性死區(qū)”,總之暂题,暫時性死區(qū)的本質就是移剪,<strong>只要一進入當前作用域,所要使用的變量就已經存在了薪者,但是不可獲取纵苛,只有等到聲明變量的那一行代碼出現,才可以獲取和使用該變量</strong>言津。

var tmp = 123;
if (true) {
  tmp = "abc"; // ReferenceError
  let tmp;
}

不允許重復聲明

let 不允許同一作用域內重復聲明同一個變量攻人,var可以重復聲明。

var str;
var str; // 可以

var str;
let str; //報錯

let str1悬槽;
let str1; //報錯

因此怀吻,函數內部不能使用let重復聲明參數

function fun(str) {
    var str = "222"
    console.log(str);
}

fun("111"); // 222


function fun(str) {
    let str = "222"
    console.log(str);
}

fun("111"); // 報錯

不屬于window屬性

var、function屬于全局變量初婆,是頂層對象的屬性烙博,let、const烟逊、class 不屬于頂層對象屬性,不可通過window.去訪問

const

const 聲明一個只讀的常量铺根,一旦被聲明就不允許改變宪躯。

const str = "str"
str = "str" // 報錯

const和let一樣聲明只在塊級作用域有效,同樣沒有變量提升位迂,和存在暫時性死區(qū)访雪,也不可重復聲明

const的本質

我們都知道,基本類型數據存在棧內存中掂林,引用類型數據只是在棧內存存儲了一個指向堆內存的指針臣缀,實際數據存放在堆內存中。
const并不是保證這個變量不可以改變泻帮,而是保證這個變量指向的占內存的值不可改變精置,所以使用const創(chuàng)建引用類型數據要小心

const arr = [];
arr.push(1) // 可以
arr = 1 // 報錯

如果想將一個對象凍結的話,可以使用Object.freeze方法

const foo = Object.freeze({});
// 常規(guī)模式時锣杂,面一行不起作用脂倦;
// 嚴格模式時番宁,該行會報錯
foo.prop = 123;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赖阻,隨后出現的幾起案子蝶押,更是在濱河造成了極大的恐慌,老刑警劉巖火欧,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棋电,死亡現場離奇詭異,居然都是意外死亡苇侵,警方通過查閱死者的電腦和手機赶盔,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衅檀,“玉大人招刨,你說我怎么就攤上這事“Ь” “怎么了沉眶?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杉适。 經常有香客問我谎倔,道長,這世上最難降的妖魔是什么猿推? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任片习,我火速辦了婚禮,結果婚禮上蹬叭,老公的妹妹穿的比我還像新娘藕咏。我一直安慰自己,他們只是感情好秽五,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布孽查。 她就那樣靜靜地躺著,像睡著了一般坦喘。 火紅的嫁衣襯著肌膚如雪盲再。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天瓣铣,我揣著相機與錄音答朋,去河邊找鬼。 笑死棠笑,一個胖子當著我的面吹牛梦碗,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼叉弦,長吁一口氣:“原來是場噩夢啊……” “哼丐一!你這毒婦竟也來了?” 一聲冷哼從身側響起淹冰,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤库车,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后樱拴,有當地人在樹林里發(fā)現了一具尸體柠衍,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年晶乔,在試婚紗的時候發(fā)現自己被綠了珍坊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡正罢,死狀恐怖阵漏,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情翻具,我是刑警寧澤履怯,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站裆泳,受9級特大地震影響叹洲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜工禾,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一运提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闻葵,春花似錦民泵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竟痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掏呼,已是汗流浹背坏快。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憎夷,地道東北人莽鸿。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祥得。 傳聞我的和親對象是個殘疾皇子兔沃,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344