前言
ECMAScript 6.0(簡稱ES6),作為一代JavaScript的語言標(biāo)準(zhǔn)正式發(fā)布于2015 年 6 月糕韧,至今已經(jīng)發(fā)布3年多了,這里我總結(jié)了絕大部分ES6,以及ES6以后新語法的知識點页滚,使用場景。
let/const(常用)
let,const用于聲明變量铺呵,用來替代var關(guān)鍵字裹驰,與var不同的是,let/const會創(chuàng)建一個塊級作用域(通俗講就是一個花括號內(nèi)是一個新的作用域)
這里外部的console.log(x)拿不到前面2個塊級作用域聲明的let:
在日常開發(fā)中多存在于使用if/for關(guān)鍵字結(jié)合let/const創(chuàng)建的塊級作用域片挂,值得注意的是使用let/const關(guān)鍵字聲明變量的for循環(huán)和var聲明的有些不同
for循環(huán)包括三個部分幻林,第一部分一個變量聲明,第二部分一個循環(huán)的結(jié)束的條件音念,第三部分每次循環(huán)要執(zhí)行的表達(dá)式沪饺,也就是說第一部分在這個for循環(huán)中只會執(zhí)行一次var i = 0,而后面的兩個部分在每次循環(huán)的時候都會執(zhí)行一遍闷愤。
而使用使用let/const關(guān)鍵字聲明變量的for循環(huán)整葡,除了會創(chuàng)建塊級作用域,let/const還會將它綁定到每個循環(huán)中肝谭,確保對上個循環(huán)結(jié)束時候的值進(jìn)行重新賦值掘宪。
簡而言之就是每次循環(huán)都會聲明一次(對比var聲明的for循環(huán)只會聲明一次)蛾扇,可以這么理解let/const中的for循環(huán)。
給每次循環(huán)創(chuàng)建一個塊級作用域:
暫時性死區(qū)
使用let/const聲明的變量魏滚,從一開始就形成了封閉作用域镀首,在聲明變量之前是無法使用這個變量的,這個特點也是為了彌補(bǔ)var的缺陷(var聲明的變量有變量提升)
在預(yù)編譯的階段,JS編譯器會先解析一遍判斷是否有l(wèi)et/const聲明的變量,如果在一個花括號中存在使用let/const聲明的變量,則ES6規(guī)定這些變量在沒聲明前是無法使用的,隨后再是進(jìn)入執(zhí)行階段執(zhí)行代碼鼠次。
這里當(dāng)滿足if的條件時,進(jìn)入true的邏輯,這里因為使用了let聲明了變量name,在一開始就"劫持了這個作用域",使得任何在let聲明之前使用name的操作都會報錯更哄。
const
使用const關(guān)鍵字聲明一個常量,常量的意思是不會改變的變量腥寇,const和let的一些區(qū)別是:
1.const聲明變量的時候必須賦值成翩,否則會報錯,同樣使用const聲明的變量被修改了也會報錯
2.const聲明變量不能改變赦役,如果聲明的是一個引用類型麻敌,則不能改變它的內(nèi)存地址
let/const聲明的變量卻沒有變?yōu)槿肿兞?/p>
箭頭函數(shù)(常用)
ES6 允許使用箭頭? ()=>()?定義函數(shù)
箭頭函數(shù)對于使用function關(guān)鍵字創(chuàng)建的函數(shù)有以下區(qū)別
箭頭函數(shù)沒有arguments.
箭頭函數(shù)沒有prototype屬性,不能用作構(gòu)造函數(shù)(不能用new關(guān)鍵字調(diào)用)
箭頭函數(shù)沒有自己this掂摔,它的this是詞法的术羔,引用的是上下文的this,即在你寫這行代碼的時候就箭頭函數(shù)的this就已經(jīng)和外層執(zhí)行上下文的this綁定了(這里個人認(rèn)為并不代表完全是靜態(tài)的,因為外層的上下文仍是動態(tài)的可以使用call,apply,bind修改,這里只是說明了?箭頭函數(shù)的this始終等于它上層上下文中的this)
因為setTimeout會將一個匿名的回調(diào)函數(shù)推入異步隊列乙漓,而回調(diào)函數(shù)是具有全局性的级历,即在非嚴(yán)格模式下this會指向window,就會存在丟失變量a的問題叭披,而如果使用箭頭函數(shù)寥殖,在書寫的時候就已經(jīng)確定它的this等于它的上下文(這里是makeRequest的函數(shù)執(zhí)行上下文,相當(dāng)于將箭頭函數(shù)中的this綁定了makeRequest函數(shù)執(zhí)行上下文中的this)因為是controller對象調(diào)用的makeRequest函數(shù)涩蜘,所以this就指向了controller對象中的a變量
箭頭函數(shù)的this指向即使使用call,apply,bind也無法改變(這里也驗證了為什么ECMAScript規(guī)定不能使用箭頭函數(shù)作為構(gòu)造函數(shù)嚼贡,因為它的this已經(jīng)確定好了無法改變)
箭頭函數(shù)使代碼更加簡潔
Es5:寫法
Es6:箭頭函數(shù)
在數(shù)組的迭代中使用箭頭函數(shù)更加簡潔,并且可以省略return關(guān)鍵字
注意:不要在可能改變this指向的函數(shù)中使用箭頭函數(shù)同诫,類似vue中的methods,computed中