以前我們在定義變量時用的是 var ,而es6 又給我們提供了兩種方法 let 和 const (const 是定義常量的)。今天我就來總結一下let 和const 。比較簡單,大神麼鳥我。
一、let 定義變量。
我們使用let定義的變量和 es5 中 var 定義的變量具有一下區別。
1. let定義的變量具塊兒級有作用域
什麼是塊兒級作用域,就像 {}
花括號內的,爲塊兒級作用域。所以let 在塊級作用域內聲明後,塊兒級作用域外面是訪問不到的。
function a(){
let b = 10;
console.log(b) //10 可以方問
}
a();
console.log(b); //報錯 Uncaught ReferenceError: b is not defined
而如果我們將上面的 let 改爲 var聲明變量是不會出現報錯的。這個let 聲明的變量很好的解決了我們以前的閉包問題。 閉包問題不懂的可以看看我以前文章http://blog.csdn.net/webxiaoma/article/details/53213113
我們如果用var 聲明變量會產生以下情況
function a(){
var b = 10;
function c(){
b++;
console.log(b)
}
return c;
}
d = a();
d(); // 11
d(); // 12
這是應爲 當變量d 引用 函數c時 形成了閉包。變量b 在被引用後不會立即回收,而是存儲起來了。所以每次執行d(); b變量都會累計加一,有時候我們需要改變這種情況,以前我們會這麼做。
function a(){
var b = 10;
(function c(){
b++;
console.log(b)
})()
}
a(); // 11
a(); // 11
其實現在我們完全可以用es6的let去這麼寫
function a(){
let b = 10; // 只需要將我們第一次的代碼的 var 改爲 let即可。
function c(){
b++;
console.log(b)
}
return c;
}
d = a();
d(); // 11
d(); // 11
2. let定義的變量不會被提升。
let 聲明的變量是不會被提升的。例如在es5中我們這樣做。
console.log(a) //結果 underfind
var a = 5;
瀏覽器並不會報錯而是 underfind,這是因爲變量a 被提升了,不知道變量提升 原則的可以看看我以前的文章:http://blog.csdn.net/webxiaoma/article/details/52431203
而我們用let聲明的變量 這樣寫瀏覽器會直接報錯
console.log(a) //Uncaught ReferenceError: a is not defined
let a = 5;
3. let定義的變量不能夠被覆蓋,但是值可以被修改。
let聲明的變量不可以被修改,例如:
let a = 5;
let a =6;
console.log(a) //報錯 'a' has already been declared
而如果是用var 去聲明的變量,會直接覆蓋掉a以前的值。雖然let聲明的變量不可以被修改,但是我們可以更改它的值
例如:
let a = 5;
a =6;
console.log(a) // 結果 6;
一、const 定義常量。
1.什麼是常量,常量在es6 中是不能被修改的。
const聲明的常量 同樣具有let
的上述三個特點。唯一不同的是,let聲明的變量,變量指針是不能被修改的,但是指針所指的地址的值是可以被修改的,而const聲明的常量,是都不可以被修改的,否則瀏覽器會錯。
const a = 5;
a =6;
console.log(a) //報錯 Assignment to constant variable.
上邊代碼運行會報錯,而let和var聲明的變量是不會報錯的。
es6的這些寫法,對我個人來說感覺還是挺好的,方便,對我們寫代碼也去起到一定的規範作用。