1. 程式人生 > >let 和 const 以及var 區別

let 和 const 以及var 區別

ES5 只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景。

ES6中增加了塊級作用域的概念,

let 命令

1. let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的程式碼塊內有效。

{
    let a =10;
    var b= 8;
}

console.log(a);//ReferenceError: a is not defined(let宣告的變數只在當前程式碼塊內有效)
console.log(b);//1

2. 不存在變數提升

 對比:

var命令會發生”變數提升“現象,即變數可以在宣告之前使用,值為undefined

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

// let 的情況
console.log(b); // 報錯ReferenceError
let b = 2;

3. 不允許重複宣告

let不允許在相同作用域內,重複宣告同一個變數。

4. 暫時性死區

只要塊級作用域記憶體在let命令,它所宣告的變數就“繫結”(binding)這個區域,不再受外部的影響。在程式碼塊內,使用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱 TDZ)。

var tmp = 888;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}
說明:
    由於存在全域性變數tmp,但是塊級作用域內let又聲明瞭一個區域性變數tmp,同一個作用域內,不能重複宣告同一個變數,所以在let宣告前,對tmp進行賦值則報錯

const

1. const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。

const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.
說明:
const一旦初始化賦值,就不能改變

2. const一旦宣告變數,就必須立即初始化,不能留到以後賦值。對於const來說,只宣告不賦值,就會報錯

const a;// SyntaxError: Missing initializer in const declaration
說明:const一旦宣告,必須賦值

3. const命令宣告的常量也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用。

if (true) {
  console.log(b); // ReferenceError
  const b = 5;
}

4. const的作用域與let命令相同:只在宣告所在的塊級作用域內有效。

if (true) {
  const b= 2;
}
console.log(b);//報錯
  • var:變數提升(無論宣告在何處,都會被提至其所在作用於的頂部)
  • let:無變數提升(未到let宣告時,是無法訪問該變數的)
  • const:無變數提升,宣告一個基本型別的時候為常量,不可修改;宣告物件可以修改