前端筆記(關於箭頭函數與普通函數的區別的理解)
大家都知道箭頭函數是es6新增的函數聲明方式,當然普通函數還是可以繼續使用的。我以前一直只知道箭頭函數只對this指向有影響,但是沒法說清楚具體有哪些影響,因此今天來總結整理一下。
1.普通函數的this指向當前調用者對象。箭頭函數的this指向其上下文
let obj={ a:function(){ console.log(this)//當前調用者 }, b:()=>{ console.log(this)//上下文 } } obj.a() obj.b()
2.箭頭函數不能作為構造函數,所以也不能new,new就會報錯。普通函數可以
3.箭頭函數不能使用arguments,但可以使用…rest代替。rest參數也能在普通函數中使用,用於函數中傳遞不定參數
arguments是類數組,需要遍歷進行使用。arguments和rest都必須寫在最後面。
const A=(...a)=>{ console.log(a) } A(1,2,3,4)//數組 const B=function(){ console.log(arguments) } B(1,2,3,4)//類數組
4.箭頭函數沒有原型對象,普通函數有
//原型區別 const F=()=>{} const G=function(){} console.log(F.prototype)//undefined console.log(G.prototype)//原型對象
拓展知識:
1.call、apply、bind可以改變普通函數this指向,無法改變箭頭函數的this指向
此處使用call後this就不是參數1的對象了,然後自動調用f函數。
apply:參數2傳的是數組。bind:重新綁定對象,生成新的函數,需要重新調用
//改變this指向 const f=function(a){ console.log(this.name+a) } f()//undefined f.call({name:1},2)//3
這個this還是代表上下文,不是那個對象
const F=()=>{ console.log(this) } F.call({a:1})//window