先說說let。let有塊級做用域一說,即{}就是一個塊級做用域。在{}內使用let聲明的變量,{}外沒法使用。數組
{let a = 5} console.log(a) // Uncaught ReferenceError: a is not defined
再就是和var的區別在於for循環中,在for循環中時候var聲明的變量,i指向同一個,而是用let聲明的變量都是獨立的。函數
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10 循環內被賦給數組 a 的函數內部的console.log(i),裏面的 i 指向的就是全局的 i var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6 當前的 i 只在本輪循環有效,因此每一次循環的i其實都是一個新的變量
let命令不存在變量提高,存在暫時性死區,因此養成好習慣:變量必定要先聲明後使用。指針
對於函數聲明,環境致使的行爲差別,避免在塊級做用域內聲明函數。若是確實須要,也應該寫成函數表達式,而不是函數聲明語句!!!code
對於const的理解,須要注意其 不變 的含義:const實際上保證的,並非變量的值不得改動,而是變量指向的那個內存地址不得改動。(因此對於非引用數據類型地址保存了該數值,而對於引用數據類型地址是一個指針),所以const聲明的對象中的key,value是能夠改變的,若是真的想將對象凍結,應該使用Object.freeze方法。對象
最後,在ES6中聲明變量的方式有6中: var、function、let、const、import、class內存