var
變量聲明
var
是用於聲明變量,聲明的變量掛載在window
下。
console.log(i,window.i)
if(true){
var i = 10;
}
console.log(i,window.i )
我們可以看到變量聲明提前,在if
外任意可以訪問。
let
變量聲明
let
聲明的變量不會掛載在window
下,新增了塊級作用域,在ES6
以前只有函數作用域和全局作用域。
if(true){
let i = 10;
console.log(i,window.i )
}
console.log(i)
在window
中不存在i
,且在let
聲明的塊級作用域下才可訪問,在塊級作用域外無法訪問,這樣做不會造成變量污染。
console.log(i)
let i = 10;
值得一提的是在網絡上大多說的是let
不會有聲明提前,當然這只是人看到的效果,實際有聲明提前在暫時性死區中 Uncaught ReferenceError: Cannot access 'i' before initialization(暫時性死區)
const
常量聲明
和let
的不同的地方時const
是用於常量聲明,常量是不可變化的量,必須定義和複製,所有常量一經定義,就不允許被修改,也不允許改變空間的地址。
當我們定義未賦值時報錯
const a;
當我們嘗試修改常量時報錯。
const a = 123;
a = 456;
總結
var
過多的使用容易造成變量污染,我們日常開發中儘可能的使用ES6
中的let
和const
。
let
和const
是不允許重複聲明的。
let
的聲明會形成塊級作用域,不會造成變量的污染。
常量比變量的效率要高,能使用const
就是用const
,不能使用const
就用let
。