let var與const

Bubbleegum.發表於2020-10-25

1.說在let var const之前要引入的是塊級作用域

ES5 只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景。
塊級作用域包括{},if語句和for語句裡面的{}

2.var

1.var定義的變數,沒有塊的概念,可以跨塊訪問, 不能跨函式訪問。
2.可以重複宣告,後面的會覆蓋前面的。
3.存在變數提升(即未初始化會輸出undefined,不報錯)。

{
  var b = 1;
}
b // 1

{
  var a=1;
  var a=2;
}
a // 2

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


3.let

1.let是塊級作用域,在塊內使用對塊外沒有影響
2.let不允許重複宣告,會報錯。
3.不存在變數提升.
4.暫時性死區

{
  let a = 10;
}
a // ReferenceError: a is not defined.

{
  let a=1;
  let a=2;
}    //報錯

console.log(bar); // 報錯ReferenceError
let bar = 2;

暫時性死區:只要塊級作用域記憶體在let命令,它所宣告的變數就“繫結”(binding)這個區域,不再受外部的影響。

if (true) {
  // TDZ開始
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError

  let tmp; // TDZ結束
  console.log(tmp); // undefined

  tmp = 123;
  console.log(tmp); // 123
}

4.const

1.宣告一個只讀的常量。一旦宣告,常量的值就不能改變。
2.const宣告的變數不得改變值,這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值。
3.只能在塊作用域裡訪問,存在暫時性死區,不存在變數宣告提前,不允許重複定義

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


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

相關文章