??周末在阿里淘寶的電話面試中被問到箭頭函數(shù)和普通函數(shù)的區(qū)別,沒能回答全面蜒犯,現(xiàn)進行總結(jié)如下:
??ES6標準新增了一種新的函數(shù):Arrow Function(箭頭函數(shù))矢洲,為什么叫Arrow Function百拓?因為它的定義用的就是一個箭頭泥彤,那么,它和普通函數(shù)有哪些不同呢蝌借?
箭頭函數(shù)的特點
??箭頭函數(shù)相當于匿名函數(shù)田柔,并且簡化了函數(shù)定義。箭頭函數(shù)有兩種格式骨望,一種只包含一個表達式硬爆,連{ ... }和return都省略掉了。還有一種可以包含多條語句擎鸠,這時候就不能省略{ ... }和return缀磕。
- 相比普通函數(shù),箭頭函數(shù)有更簡潔的語法
-
箭頭函數(shù)不綁定this,會捕獲其所在的上下文的this值袜蚕,作為自己的this值
- 函數(shù)體內(nèi)的this對象糟把,就是定義時所在的對象,而不是使用時所在的對象牲剃。
- 把動態(tài)this轉(zhuǎn)換為靜態(tài)this:長期以來遣疯,JavaScript 語言的this對象一直是一個令人頭痛的問題,在對象方法中使用this凿傅,必須非常小心缠犀。箭頭函數(shù)”綁定”this,很大程度上解決了這個困擾聪舒。
- 箭頭函數(shù)可以讓this指向固定化辨液,這種特性很有利于封裝回調(diào)函數(shù)。
- 原理: this指向的固定化箱残,并不是因為箭頭函數(shù)內(nèi)部有綁定this的機制滔迈,實際原因是箭頭函數(shù)根本沒有自己的this,導致內(nèi)部的this就是外層代碼塊的this被辑。正是因為它沒有this燎悍,所以也就不能用作構(gòu)造函數(shù)鲜滩。
- 箭頭函數(shù)是匿名函數(shù)刹淌,不能作為構(gòu)造函數(shù)抡柿,不可以使用new命令扩所,否則會拋出一個錯誤。所以箭頭函數(shù)也不具有new.target郎楼。
原因:構(gòu)造函數(shù)的new都做了些什么?簡單來說,分為四步
- JS內(nèi)部首先會先生成一個對象举哟;
- 再把函數(shù)中的this指向該對象;
- 然后執(zhí)行構(gòu)造函數(shù)中的語句迅矛;
- 最終返回該對象實例妨猩。
-
箭頭函數(shù)不綁定arguments,取而代之用rest參數(shù)...解決秽褒;所以箭頭函數(shù)也沒有arguments.callee和arguments.caller
??不可以使用arguments對象壶硅,該對象在函數(shù)體內(nèi)不存在。如果要用销斟,可以用 rest 參數(shù)代替庐椒。想要在箭頭函數(shù)中以類似數(shù)組的形式取得所有參數(shù),可以利用展開運算符來接收參數(shù)蚂踊,比如:
const testFunc = (...args)=>{ console.log(args) //數(shù)組形式輸出參數(shù) }
??在 ECMAScript 6 之前的函數(shù)聲明中约谈,它們的參數(shù)都是“簡單參數(shù)類型”的。在 ECMAScript 6 之后,凡是在參數(shù)聲明中使用了缺省參數(shù)棱诱、剩余參數(shù)和模板參數(shù)之一的泼橘,都不再是“簡單的”(non-simple parameters)。
??在使用傳統(tǒng)的簡單參數(shù)時迈勋,只需要將調(diào)用該參數(shù)時傳入的實際參數(shù)與參數(shù)對象(arguments)綁定就可以了炬灭;而使用“非簡單參數(shù)”時,需要通過“初始器賦值”來完成名字與值的綁定靡菇。
??兩種綁定模式的區(qū)別在于:通常將實際參數(shù)與參數(shù)對象綁定時重归,只需要映射兩個數(shù)組的下標即可,而“初始器賦值”需要通過名字來索引值(以實現(xiàn)綁定)镰官,因此一旦出現(xiàn)“重名參數(shù)”就無法處理了提前。 - 使用call()、apply()和bind()調(diào)用泳唠,對 this 沒有什么影響
由于 this 已經(jīng)在詞法層面完成了綁定狈网,通過 call()、 apply()笨腥、bind() 方法調(diào)用一個函數(shù)時拓哺,只傳入了一個參數(shù),對 this 并沒有什么影響
- 箭頭函數(shù)沒有原型屬性prototype
- 不能簡單返回對象字面量
如果要直接返回對象時需要用小括號包起來脖母,因為大括號被占用解釋為代碼塊了
- 不能使用yield關鍵字士鸥,因此箭頭函數(shù)不能用作 Generator 函數(shù)。
- 箭頭函數(shù)括號后面不能換行谆级;
- 箭頭函數(shù)不具有super烤礁。
總結(jié)
- 箭頭函數(shù)的 this 永遠指向其上下文的 this ,任何方法都改變不了其指向肥照,如 call() , bind() , apply() 脚仔,可以說正是因為沒有自己的this,才使其具備了以上介紹的大部分特點舆绎;
- 普通函數(shù)的this指向調(diào)用它的那個對象鲤脏。