var 和 let 的區別

kari發表於2019-04-03

let 不允許重複宣告

let 不允許在同一作用域重複宣告:

let a = 1
let a = 'hello'

// Uncaught SyntaxError: Identifier 'a' has already been declared
複製程式碼

var 可以重複宣告,並且後面的宣告將前面的宣告覆蓋:

var a = 1
var a = 'hello'
console.log(a)

// hello
複製程式碼

let 宣告的變數是塊級作用域變數

let 宣告的變數是塊級作用域變數:

{
    let a = 100
}
console.log(a)

// Uncaught ReferenceError: a is not defined at <anonymous>:5:13
複製程式碼

var 宣告的變數是全域性變數:

{
    var a = 100
}
console.log(a)

// 100
複製程式碼

let 沒有變數提升

let 宣告的變數不存在變數提升,並且必須在 let 宣告變數後才可以使用該變數:

// 先使用,後宣告
console.log(person1)
let person1 = 'kari'

// Uncaught SyntaxError: Identifier 'person1' has already been declaredat <anonymous>:1:1
複製程式碼
// 先宣告,後使用
let person1 = 'kari'
console.log(person1)

// kari
複製程式碼

var 宣告的變數會變數提升:

console.log(person1)
var person1 = 'kari'

// undefined

//等同於
var person = undefined
console.log(person1)
person1 = 'kari'

// undefined
複製程式碼

let 會造成暫時性死區

由於 let 前面的特性,就很容易造成“暫時性死區”現象:

var s = 123;
if (true) {
  s = 'abc'
  let s
  console.log(s)
}

// Uncaught ReferenceError: s is not defined at <anonymous>:3:7
複製程式碼

var 宣告瞭全域性變數 s,但是在塊級作用域內 let 宣告瞭變數 s 後,let 所宣告的變數變繫結了這一作用域,不再受外部的影響。
並且必須在 let 宣告變數後才可以使用該變數,但是上面程式碼由於沒有先 let 聲量變數,所以報錯。

var 宣告變數時不會造成“暫時性死區”現象:

var s = 123
if (true) {
  s = 'abc'
  var s
  console.log(s)
}

// abc
複製程式碼

相關文章