JavaScript的ES6語法-let與const

ECMAScript 6.0(簡稱 ES6)是 JavaScript 語言的下一代標(biāo)準(zhǔn)贷掖,已經(jīng)在 2015 年 6 月正式發(fā)布。

ES6新增語法:

  1. let

    • ES6新增了let關(guān)鍵字剂府,與var類似自脯,用于聲明變量剩檀。
    1. let聲明的變量只在它所在的代碼塊內(nèi)有效

      {
          var a = 10;
          let b = 20;
      }
      console.log(a);
      console.log(b);
      

    for循環(huán)的計(jì)數(shù)器澄干,就很合適使用let命令。

    使用var關(guān)鍵字聲明的for循環(huán)跷跪,在全局范圍內(nèi)都有效每次循環(huán)改變的是i的值馋嗜,函數(shù)內(nèi)部的i指向全局的i,而此時(shí)for循環(huán)早已結(jié)束吵瞻,則i輸出的是for循環(huán)最后一輪的值葛菇。

    var a = [];
    for (var i = 0; i < 5; i++) {
        a[i] = function() {
            console.log(i);
        }
    }
    a[3]();
    

    使用let關(guān)鍵字聲明的for循環(huán),此時(shí)的i只在本輪的循環(huán)有效橡羞,每次循環(huán)的i都是一個(gè)新的變量眯停,JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i時(shí)卿泽,就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算佩番。

    var a = [];
    for (let i = 0; i < 5; i++) {
        a[i] = function() {
            console.log(i);
        }
    }
    a[3]();
    

    另外使用for循環(huán)有一個(gè)特別之處墩虹,就是設(shè)置循環(huán)變量的那部分是一個(gè)父作用域包晰,而循環(huán)體內(nèi)部是一個(gè)單獨(dú)的子作用域赴穗。

    for (let i = 0; i < 3; i++) {
        let i = 'abc';
        console.log(i);
    }
    


2.let不存在變量提升

  ```javascript
  console.log(a);
  var a = 1;
  console.log(b);
  let b = 2;
  ```

3.暫時(shí)性死區(qū)

  • 只要塊級(jí)作用域內(nèi)存在let命令,它所聲明的變量就“綁定”(binding)這個(gè)區(qū)域覆致,不再受外部的影響侄旬。

  • 下面代碼中肺蔚,存在全局變量tmp煌妈,但是塊級(jí)作用域內(nèi)let又聲明了一個(gè)局部變量tmp,導(dǎo)致后者綁定這個(gè)塊級(jí)作用域宣羊,所以在let聲明變量前璧诵,對(duì)tmp賦值會(huì)報(bào)錯(cuò)。

  • 應(yīng)該就是仇冯,只要在一個(gè)塊級(jí)作用域內(nèi)之宿,存在let關(guān)鍵字,那么let關(guān)鍵字初始化變量之前該變量不可用苛坚,即便全局作用域存在同名變量也不可用比被。

  • 凡是在聲明之前就使用這些變量色难,就會(huì)報(bào)錯(cuò)。

  • 總之等缀,在代碼塊內(nèi)枷莉,使用let命令聲明變量之前,該變量都是不可用的尺迂。這在語法上笤妙,稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡稱 TDZ)噪裕。

    var tmp = 123;
    
    if (true) {
        //start TDZ
        tmp = 'abc';
        let tmp;//end TDZ
    }
    


4.變量不允許重復(fù)定義

  • let不允許在相同作用域內(nèi)蹲盘,重復(fù)聲明同一個(gè)變量

  • let也不能重復(fù)聲明var聲明過的變量

  • var也不能重復(fù)聲明let聲明過的變量

  • 因此,不能在函數(shù)內(nèi)部重新聲明參數(shù)

    let a = 1;
    let a = 2;
    //Uncaught SyntaxError: Identifier 'a' has already been declared
    var a = 1;
    let a = 2;
    //Uncaught SyntaxError: Identifier 'a' has already been declared
    

    5.塊級(jí)作用域

    • ES6 允許塊級(jí)作用域的任意嵌套膳音。

    • 內(nèi)層作用域可以定義外層作用域的同名變量召衔。(外部不能使用內(nèi)部定義的變量,但內(nèi)部可以使用外部的變量)

      {
          let x = 1; {
              let y = 2; {
                  let z = 3;
                  let x = 'new1';
                  console.log(x);
                  console.log(y);
              }
          }
          console.log(z);
      }
      
  1. 函數(shù)與塊級(jí)作用域

    • ES5 規(guī)定祭陷,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明薄嫡,不能在塊級(jí)作用域聲明。

      if (true) {
          function a() {}
      }
      switch (1) {
          case 1:
              function b() {};
              break;
      }
      
    • 但是颗胡,瀏覽器沒有遵守這個(gè)規(guī)定毫深,為了兼容以前的舊代碼,還是支持在塊級(jí)作用域之中聲明函數(shù)毒姨,因此上面兩種情況實(shí)際都能運(yùn)行哑蔫,不會(huì)報(bào)錯(cuò)。

    • ES6 引入了塊級(jí)作用域弧呐,明確允許在塊級(jí)作用域之中聲明函數(shù)闸迷。ES6 規(guī)定,塊級(jí)作用域之中俘枫,函數(shù)聲明語句的行為類似于let腥沽,在塊級(jí)作用域之外不可引用。

    • 如果改變了塊級(jí)作用域內(nèi)聲明的函數(shù)的處理規(guī)則鸠蚪,顯然會(huì)對(duì)老代碼產(chǎn)生很大影響今阳。為了減輕因此產(chǎn)生的不兼容問題,ES6 在附錄B里面規(guī)定茅信,瀏覽器的實(shí)現(xiàn)可以不遵守上面的規(guī)定盾舌,有自己的行為方式。

      • 允許在塊級(jí)作用域內(nèi)聲明函數(shù)蘸鲸。
      • 函數(shù)聲明類似于var妖谴,即會(huì)提升到全局作用域或函數(shù)作用域的頭部。
      • 同時(shí)酌摇,函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部膝舅。

      注意嗡载,上面三條規(guī)則只對(duì) ES6 的瀏覽器實(shí)現(xiàn)有效,其他環(huán)境的實(shí)現(xiàn)不用遵守仍稀,還是將塊級(jí)作用域的函數(shù)聲明當(dāng)作let處理鼻疮。

    • 所以,根據(jù)這三條規(guī)則琳轿,瀏覽器的 ES6 環(huán)境中判沟,塊級(jí)作用域內(nèi)聲明的函數(shù),行為類似于var聲明的變量崭篡。

    • 總之挪哄,考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)琉闪。如果確實(shí)需要迹炼,也應(yīng)該寫成函數(shù)表達(dá)式,而不是函數(shù)聲明語句颠毙。

  2. const

    1. const聲明一個(gè)只讀的常量斯入。一旦聲明,常量的值就不能改變蛀蜜;這意味著刻两,const一旦聲明變量,就必須立即初始化滴某,不能留到以后賦值磅摹。

      const ABC = 123;
      ABC = 456;
      
  ```javascript
  const DEF;
  //× Uncaught SyntaxError: Missing initializer in const declaration
  ```
  1. const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效。

    {
        const ABC = 123;
    }
    console.log(ABC);
    
  1. const命令聲明的常量也是不提升霎奢,同樣存在暫時(shí)性死區(qū)户誓,只能在聲明的位置后面使用。

    console.log(ABC);
    const ABC = 123;
    
image-20200602203838709.png
  1. const聲明的常量幕侠,也與let一樣不可重復(fù)聲明帝美。

    const ABC = 123;
    const ABC = 456;
    //Uncaught SyntaxError: Identifier 'ABC' has already been declared
    

ES6 聲明變量的六種方法

ES5 只有兩種聲明變量的方法:var命令和function命令。ES6 除了添加letconst命令晤硕,后面章節(jié)還會(huì)提到悼潭,另外兩種聲明變量的方法:import命令和class命令。所以窗骑,ES6 一共有 6 種聲明變量的方法女责。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漆枚,一起剝皮案震驚了整個(gè)濱河市创译,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墙基,老刑警劉巖软族,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刷喜,死亡現(xiàn)場離奇詭異,居然都是意外死亡立砸,警方通過查閱死者的電腦和手機(jī)掖疮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颗祝,“玉大人浊闪,你說我怎么就攤上這事÷荽粒” “怎么了搁宾?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倔幼。 經(jīng)常有香客問我盖腿,道長,這世上最難降的妖魔是什么损同? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任翩腐,我火速辦了婚禮,結(jié)果婚禮上膏燃,老公的妹妹穿的比我還像新娘茂卦。我一直安慰自己,他們只是感情好组哩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布疙筹。 她就那樣靜靜地躺著,像睡著了一般禁炒。 火紅的嫁衣襯著肌膚如雪而咆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天幕袱,我揣著相機(jī)與錄音暴备,去河邊找鬼。 笑死们豌,一個(gè)胖子當(dāng)著我的面吹牛涯捻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播望迎,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼障癌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辩尊?” 一聲冷哼從身側(cè)響起涛浙,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后轿亮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疮薇,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年我注,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了按咒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡但骨,死狀恐怖励七,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奔缠,我是刑警寧澤呀伙,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站添坊,受9級(jí)特大地震影響剿另,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贬蛙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一雨女、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阳准,春花似錦氛堕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绕沈,卻和暖如春锐想,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乍狐。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工赠摇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浅蚪。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓藕帜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惜傲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洽故,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354