雖然用著ES6一些常用的簡單語法,但是對於ES6一直沒有一個完整的認識,不管是用得上還是用不上。於是決定重頭好好學一遍ES6。
塊級作用域:
Let和const宣告的是塊級作用域的變數,讓變數的作用域更合理了,更是很簡單的解決了for迴圈閉包的經典問題。
function f() { let n = 5; if (true) { let n = 10; console.log(n); //10 } console.log(n); //5}f()
外層程式碼塊不受內層程式碼塊的影響。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
函式內部的變數i與迴圈變數i不在同一個作用域,有各自單獨的作用域。
不存在變數提升:
Let和const宣告的變數不像var一樣存在變數提升,宣告的只能在let宣告之後使用。
console.log(a); //ReferenceError: a is not definedlet a = 2;console.log(b);var b = 0;//undefined
暫時性死區:
區塊中存在let和const命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。簡單說就是let是優先順序。
var a = 123;if (true) { a = 1; //ReferenceError: a is not defined let a;}
不允許重複宣告:
const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。這意味著,const一旦宣告變數,就必須立即初始化,不能留到以後賦值,否則報錯。
const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址所儲存的資料不得改動。至於它指向的資料結構是不是可變的,就完全不能控制了。
const obj = {};obj.a = 0;
不會報錯,想要具體瞭解記憶體地址,建議看一下之前堆疊的文章,
頂層物件:
頂層物件,在瀏覽器環境指的是window物件,在 Node 指的是global物件。ES5 之中,頂層物件的屬性與全域性變數是等價的。
window.a = 1;a = 2;window.a // 2
上面程式碼中,頂層物件的屬性賦值與全域性變數的賦值,是同一件事。
頂層物件的屬性與全域性變數掛鉤,被認為是 JavaScript 語言最大的設計敗筆之一。
let命令、const命令、class命令宣告的全域性變數,不屬於頂層物件的屬性。也就是說,從 ES6 開始,全域性變數將逐步與頂層物件的屬性脫鉤。
let b = 1;
window.b // undefined
歡迎關注Coding個人筆記 公眾號