1.let
用法類似var,但是聲明的變量只在代碼塊中有效
{
let a = 0;
var b =1;
}
a //ReferenceError:a is not defined
b //1
比如下面的案例:
var a = []
for(var i = 0;i<10;i++){
a[i]=function(){
console.log(i)
}
}
a[9](); // 10
....
a[0](); // 10
會發(fā)現(xiàn),輸出的結(jié)果都是10,如果想輸出每一次的i的值,可以使用IIFE,或者最簡單的,把 var 改成 let
暫時性死區(qū)
只要塊級作用于存在let聲明的變量,那么這個變量就綁定了這個區(qū)域,不會在收到外部的影響
var a = 0;
if(true){
a = 123; // referenceerror
let a;
}
不允許重復(fù)聲明
function(){
let a=0;
let/var a =1; //報錯
}
2.塊級作用域
為什么需要塊級作用域
比如:
for(var i = 0;i<5;i++){
......
}
console.log(i); //5
變量i只想用來控制循環(huán),但是循環(huán)結(jié)束后,i沒消失,而泄露成了全局變量.
ES6的塊級作用域
比如:
function(){
let a =1;
if(1){
let a = 2;
}
console.log(a) // 1
}
兩個代碼塊都聲明了變量a,但是外層代碼塊不受內(nèi)層代碼塊的影響.
塊級作用域與函數(shù)聲明
ES5 規(guī)定,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明征唬,不能在塊級作用域聲明捌显。但是瀏覽器為了兼容以前的舊代碼,支持在會計作用于之中聲明函數(shù),不會報錯.
表現(xiàn):在瀏覽器的 ES6 環(huán)境中,塊級作用域內(nèi)聲明的函數(shù)总寒,行為類似于var聲明的變量扶歪。
const
const
聲明一個只讀的常量,一旦聲明,值就不能改變
const p=3.14;
p// 3.14
p= 1 ;TypeError: Assignment to constant variable.
因為值無法改變,所以在聲明的時候,就必須初始化,否則會報錯
const p; //SyntaxError: Missing initializer in const declaration
作用域與let相同,且與let一樣不可重復(fù)聲明
const本質(zhì)
const
本質(zhì)是保證const聲明的變量指向的地址不得改動.
比如:
const p = {}
p.a='a'
p= '123' //TypeError: "p" is read-only
other
let
和const
都不存在變量提升,
頂層對象
頂層對象,瀏覽器中是window
node中是global
window.a=1
a //1
全局變量跟頂層對象的屬性是等價的.但在es6中 var 和function 聲明的依舊是頂層對象,但是let
,const
,class
聲明的全局變量,不在屬于頂層對象.