箭頭函數是ES6語法中新加的一個定義函數的方法,這節(jié)主要介紹它與普通函數的一些區(qū)別:
1. 箭頭函數沒有自己的this
箭頭函數不會創(chuàng)建自己的this,它沒有自己的this,它會繼承作用域鏈的上一層this。它會捕獲函數定義時所處的外部環(huán)境的this。因此不會再改變。
普通函數的this值與調用位置有關系。
舉例:
function func1(){
console.log('普通函數this',this)
}
let func2=()=>{
console.log('箭頭函數this',this)
}
let obj={
func2:func2,
func1:func1
}
obj.func1()
obj.func2()

運行結果.png
由上可驗證上述說法,普通函數func1由于調用時是在obj對象上調用的,所以其this指向的是obj對象。箭頭函數func2的this與定義時的位置有關系,所以func2的this指向的是window對象。
2. 不可以改變this的指向
普通函數可以通過call, apply, bind等方法改變this的指向,而箭頭函數的this從定義時就確定好了,無法改變指向。
舉個例子:
let obj={
name: 'aaa'
}
var name = 'bbb'
function func1(){
console.log(this.name)
}
let func2=()=>{
console.log(this.name)
}
func1.call(obj) //aaa
func2.call(obj) //bbb
上述例子中,想通過call方法打印obj中的name對箭頭函數func2是不生效的。
3. 沒有arguments數組
普通函數中arguments數組保存了函數的所有參數。但箭頭函數沒有改數組。
function func1(a){
console.log(a+arguments[0])
}
let func2=(a)=>{
console.log(a+arguments[0])
}
func1(1) //2
func2(1) //報錯
4.不能作為構造函數使用(不能new, 沒有原型對象)
箭頭函數沒有constructor指針,不能作為構造函數使用。如果調用new方法創(chuàng)建實例會報錯,因為new的過程如下:
- 創(chuàng)建一個新對象;
- 把this指向這個對象;
- 執(zhí)行構造函數中的代碼,從而將屬性和方法添加到這個對象上;
- 返回這個新對象;
因為箭頭函數沒有自己的this,它的this是外層執(zhí)行環(huán)境的this,不能控制該this的指向,所以第二步執(zhí)行時會報錯。
由于箭頭函數不能通過new創(chuàng)建實例,因而也沒有原型對象prototype的需求,所以構造函數也沒有原型對象。
參考文獻:
MDN
箭頭函數與普通函數的區(qū)別總結