es6學習之let和const

air10086發表於2019-04-09

let和const命令

let命令是在它所在的程式碼塊有效,它屬於塊級作用域,es6新增。es5只有全域性作用域和函式作用域。let命令存在暫時性死區(TDZ),即在申明前使用就會報錯,不存在變數提升

console.log(a); // 報錯
let a = 111;
複製程式碼

==let不允許在相同作用域中,重複申明同一變數==

塊級作用域和函式宣告

es6中明確規定在塊級作用域中可以宣告函式,在塊級作用域中,函式宣告語句的行為類似於let,在塊級作用域外不可引用。以下是es6中對函式宣告做的規定

  • 允許在塊級作用域內宣告函式。
  • 函式宣告類似於var,即會提升到全域性作用域或函式作用域的頭部。
  • 同時,函式宣告還會提升到所在的塊級作用域的頭部。

看下面一段程式碼

// ES6 環境
function f() { console.log('I am outside!'); }
(function () {
  if (false) {
    function f() { console.log('I am inside!'); }
  }

  f();
}());

// Uncaught TypeError: f is not a function
複製程式碼

會報錯,應該塊級作用域中的函式宣告類似於var,會被提升到塊級作用域頭部,下面是實際執行程式碼

//ES6 環境
function f() { console.log('I am outside!'); }
(function () {
    var f = undefined;
  if (false) {
    function f() { console.log('I am inside!'); }
  }

  f();
}());
// Uncaught TypeError: f is not a function
複製程式碼

所以要避免在塊級作用域中宣告函式,如果必須的話使用函式表示式

const命令

const 宣告一個只讀的常量,宣告後不可改變,需要注意的是const只是保證宣告的變數指向的那塊記憶體空間儲存的資料不能改動,對於複合型資料(物件和陣列),變數指向的記憶體地址,儲存的是一個指向實際資料的指標,const 只能保證這個指標是固定的,指標指向的資料結構是可以變的,因此物件可以新增屬性,陣列可以新增資料,但是他們不能賦給另一個變數

const foo = {};

// 為 foo 新增一個屬性,可以成功
foo.prop = 123;
foo.prop // 123

// 將 foo 指向另一個物件,就會報錯
foo = {}; // TypeError: "foo" is read-only
複製程式碼

es6中有六中宣告變數的方法:var 命令和function 命令,letconst ,還有import 命令和class命令

es5中頂層物件和全域性變數是掛鉤的,全域性宣告的變數是頂層物件的屬性,es6中let,const,class命令宣告的全域性變數不在是全域性變數的屬性

相關文章