ES6新語法於2015年發佈;而我這個前端小白在17年才接觸到。慚愧慚愧!!不過到目前為止,似乎只有FireFox和Chrome對ES6的支持相對良好。不過既然人家ES6已經出來了,還是要跟上技術的潮流。 ES6給我的感覺就是讓js越來越靠近傳統的編程語言,如java;比如裡面的面向對象的思想和語法 ...
ES6新語法於2015年發佈;而我這個前端小白在17年才接觸到。慚愧慚愧!!不過到目前為止,似乎只有FireFox和Chrome對ES6的支持相對良好。不過既然人家ES6已經出來了,還是要跟上技術的潮流。
ES6給我的感覺就是讓js越來越靠近傳統的編程語言,如java;比如裡面的面向對象的思想和語法就很接近java。所以如果有學習後端語言的童鞋的話,理解相對可能會比較好一點。額額。。好像扯得有點距離。
今天就只是說一下新增的let關鍵字:
傳統的 var 關鍵字1:
以前我們定義變數都是使用的var關鍵字。那麼ES6要新增一個let關鍵字來替換var的話,原因在哪裡?代碼中來呈現:
以上只是個很簡單的小例子,以求能夠說明問題即可。在for迴圈外面定義了一個變數n並且給它賦了值;而在for迴圈裡面我又定義了一個變數n。迴圈結束之後在迴圈的外面調用n的值,結果為5;但是我這個時候想要的n的值是我之前的定義的n的值是等於10;現在卻出現了與結果相悖。原因在於js是函數級作用域。上面的那個作用域是屬於塊級作用域的範圍。恰好呢js沒有!這就很好理解上面的小例子。也就是說,下麵在迴圈體裡面定義的n並不是一個局部變數,而是一個全局變數,它覆蓋了上面定義的n。所以n自然是迴圈之後的結果。那如果我這麼寫:
得到的結果是多少呢?不言而喻了。既然是函數級作用域了。函數裡面的n自然就是局部變數了。在函數外面是無法訪問的。
如果說上面的例子不太直觀展現的話,可以來看看一個比較經典的例子
運行arr[2]()函數之後的結果是2?還是10?結果又是不如人願了。是10!!第一次敲得時候感覺有點小失望小崩潰。沒有哪裡存在語法錯誤,沒有引用錯誤。但是結果就是10。永遠不會得到2。究其原因又是我上面說到的作用域的問題。i這個時候是全局變數了。每一次的迴圈並不是一個單獨體,而是一個受影響的整體。所以數組裡的結果都是10;這個需要好好的理解一下。有點不太好懂。
傳統的 var 關鍵字2:
var關鍵字還有一個比較明顯的特質:變數提升的問題。變數提升,就是把變數的定義提升到函數的頂部,但是變數的賦值位置還是不變即賦值不會被提升。上面所說的作用域的問題可以和這個變數提升的問題一起合攏來看,也許對問題就有一個比較全面的理解。
在這個簡單的例子中,得到的結果不是報錯而是undefined。原因就是變數a,b,c的定義提升了。而值沒有提升。那麼執行到輸出的時候自然是undefined。
上面那個的執行情況如下
這樣看應該就比較好理解了。
說了那麼多關於var的問題。那麼來看看let是如何解決的
關鍵字let 1:
函數的作用域問題:
let關鍵字是更像是傳統的編程語言中的變數的使用。他使得變數有了塊級作用域。
再來看上面那個要出錯的迴圈語句,用let關鍵字之後:
]
明顯得到了想要的結果!!因為用let聲明i變數的時候,i不是全局了而是局部。每一次的迴圈都是一次單獨的個體。上一次的不會影響下一次。所以能夠得到正解!
關鍵字let 2:
在之前說過var關鍵字存在變數的提升問題,也就是變數的定義會提升到頂部。而let則沒有這個問題。
i在定義之間進行操作;在let里是不被允許的。而用var的時候不會報錯,結果為undefined。這也說明瞭let不會存在變數提升的問題。所以使用的時候要先定義後使用。
由於let讓js具有塊級作用域,所以如果在塊外面和裡面都同時定義了相同的變數;那麼塊級裡面進行操作的時候是不管外面有無定義,只管塊級裡面。