關於ES6--let/const命令

ECMAScript 2015(簡稱 ES2015)這個詞,也是經常可以看到的。它與 ES6 的區別是:ES6 的第一個版本,就這樣在 2015 年 6 月發佈了,正式名稱就是《ECMAScript 2015 標準》(簡稱 ES2015)。2016 年 6 月,小幅修訂的《ECMAScript 2016 標準》(簡稱 ES2016)如期發佈,這個版本可以看作是 ES6.1 版,因爲兩者的差異非常小(只新增了數組實例的includes方法和指數運算符),基本上是同一個標準。根據計劃,2017 年 6 月發佈 ES2017 標準。
因此,ES6 既是一個歷史名詞,也是一個泛指,含義是 5.1 版以後的 JavaScript 的下一代標準,涵蓋了 ES2015、ES2016、ES2017 等等,而 ES2015 則是正式名稱,特指該年發佈的正式版本的語言標準。

1.let和const命令

  • 它們都是塊級作用域:
    ES5 只有全局作用域和函數作用域,沒有塊級作用域:內層變量可能會覆蓋外層變量;內層變量可能會覆蓋外層變量等等。

(1)let :聲明變量

  • 類似於var,但是所聲明的變量,只在let命令當前執行的代碼塊中有效。
    {
        var a=10;//全局變量
        let b=20;//在當前作用域內有效
    }
      console.log(a);//10
      console.log(b);//b is not defined

//適合for循環
//es5 一般情況和閉包
 for(var i=0;i<10;i++){
               setTimeout(function () {
                   console.log(i);//輸出一直是10 替代 自加
               },1);
           }
//閉包 
for(var i=0;i<10;i++){
               (function(a){
                   setTimeout(function () {
                       console.log(a);//輸出0-10
                   },0);
               })(i);
       }
//es6
//當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量
//函數內部的變量i和外部的變量i是分離的。
//可以代替以前的自執行函數
//for循環還有一個特別之處,就是設置循環變量的那部分是一個父作用域,而循環體內部是一個單獨的子作用域。
 for(let i=0;i<10;i++){
               setTimeout(function () {
                   console.log(i);//輸出0-10 對應i
               },1);
   }
  • 不存在變量提升
   // var
       console.log(f); //undefined
       var f=0;
    //  let
      console.log(fff);//can't access lexical declaration `fff' before initialization
       let fff=5;
  • 暫時性死區(temporal dead zone,簡稱 TDZ)。
//    只要這個塊區域有let  就忽略var
    var f=0;
    if(true){
        console.log(f);
        // Cannot access 'f' before initialization 初始化前無法訪問“ f”
        let f;
    }
  • 不允許重複聲明
{
function func() {
  let a = 10;
  var a = 1;
}

function func() {
  let a = 10;
  let a = 1;
}
}
//Identifier 'a' has already been declared

(2)const

  • 聲明一個只讀的常量時,一旦聲明,常量的值不能改變。
 const c=30;//常量 可查看不可修改 在當前作用域內有效
 console.log(c);//30
 c=10;//Assignment to constant variable.at...
  • 聲明的變量不得改變值,所以聲明時需要同時初始化。
const c;
//Missing initializer in const declaration
//const聲明中缺少初始化程序
  • const命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置後面使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章