前言
==在ES6出現之前,js中的聲明變量隻有var,然而在ES6後新增了let和const
var
1.如果用var聲明一個變量
在函數内就隻在函數内生效,如果在函數外就變成了全局生效
var a = 1; //此處聲明的變量a為全局變量
function foo(){
var a = 2;//此處聲明的變量a為函數foo的局部變量
console.log(a);//2
}
foo();
console.log(a);//1
2.如果在聲明變量
時省略var 的話就會變成全局變量,如果全局變量中已經有這個變量就會更新這個變量的值
這就叫變量提升
var a = 1; //此處聲明的變量a為全局變量
function foo(){
a = 2;//此處的變量a也是全局變量
console.log(a);//2
}
foo();
console.log(a);//2
注意:1.var聲明的變量存在提升,
2.注意隻有變量聲明才會提升,對變量指派并不會提升
3.如果對沒有聲明的變量列印控制台會報錯 沒有聲明
let
let聲明的變量有幾個特點
1.let聲明的變量具有塊級作用域
注意:此處可能擴充什麼說塊級作用域:簡單來說就是外層無法擷取到内層,即使外層和内層都使用相同變量名,也都各自不影響對方
2.let不存在變量提升,換一種說法,就是 let 聲明存在暫時性死區
3.在同一個作用域下不能重複聲明
注意::此處可能擴充什麼是暫時性死區:
隻要塊級作用域記憶體在let指令,它所聲明的變量就“綁定”這個區域,不受外部的影響。
const
const 聲明方式,除了具有 let 的特點外,還有一個特點, const 的變量,一旦定義後,就不能修改,即 const 聲明的為常量。
但是,并不是說 const 聲明的變量其内部内容不可變
總結
1.var 聲明的變量屬于函數作用域,let 和 const 聲明的變量屬于塊級作用域; 2.var 存在變量提升現象,而 let 和 const 沒有此類現象; 3.var 變量可以重複聲明,而在同一個塊級作用域,let 變量不能重新聲明,const 變量不能修改。