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
複製程式碼