ES6 —— let 和 const 命令

let

1. 基本用法

let 聲明的變量,只在 let 所在代碼塊內有效。

for (let i = 0; i < 10; i++) {
  // ...
}
console.log(i);// ReferenceError: i is not defined

上面的代碼中,變量 i 只在循環體 {} 中有效,在循環外調用就會報錯。

2.不存在變量提升

var 命令存在“變量提升”現象,變量在未聲明之前使用,值爲 undefined。

但是 let 聲明的變量一定要在聲明之後調用,否則會報錯。

// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;

// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
3. 暫時性死區
var tmp = 123;
if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

上面代碼中,存在全局變量 tmp ,但是在塊級作用域內 let 又聲明瞭一個 局部變量 tmp ,導致後者綁定這個塊級作用域,所以在 let 聲明變量前,對 tmp 賦值會報錯。

在代碼塊內,使用 let 命令聲明變量之前,該變量都是不可用的,這在語法上,稱爲“暫時性死區”(TDZ)。

4. 不允許重複聲明

let 不允許在相同作用域內,重複聲明同一個變量。

// 報錯
function func() {
  let a = 10;
  var a = 1;
}
function func(arg) {
  {
    let arg; // 不報錯
  }
}

塊級作用域

ES5 只有 全局作用域和函數作用域,let 爲 JavaScript 增加了塊級作用域。

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
}

上面的函數有兩個代碼塊,都聲明瞭變量 n,運行後輸出5。這表示外層代碼塊不受內層代碼塊的影響。

const

1. 基本用法

const 聲明一個只讀常量,一旦聲明,常量的值就不能改變。這也意味着,const 一旦聲明變量,就必須進行初始化,不能之後在賦值。

const PI = 3.1415;
PI // 3.1415
PI = 3;// TypeError: Assignment to constant variable.

const foo;
// SyntaxError: Missing initializer in const declaration

此外,const 的用法和 let 相同。

  • 不存在變量提升
  • 存在暫時性死區
  • 只在塊級作用域內有效
  • 不可重複聲明
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章