ES6之let、const

wade3po發表於2019-02-02

雖然用著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;

不會報錯,想要具體瞭解記憶體地址,建議看一下之前堆疊的文章,

mp.weixin.qq.com/s/QD-0m-Gix…

頂層物件:

頂層物件,在瀏覽器環境指的是window物件,在 Node 指的是global物件。ES5 之中,頂層物件的屬性與全域性變數是等價的。

window.a = 1;a = 2;window.a // 2

上面程式碼中,頂層物件的屬性賦值與全域性變數的賦值,是同一件事。

頂層物件的屬性與全域性變數掛鉤,被認為是 JavaScript 語言最大的設計敗筆之一。

let命令、const命令、class命令宣告的全域性變數,不屬於頂層物件的屬性。也就是說,從 ES6 開始,全域性變數將逐步與頂層物件的屬性脫鉤。

let b = 1;

window.b // undefined

歡迎關注Coding個人筆記 公眾號

相關文章