箭頭函數

箭頭函數是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的過程如下:

  1. 創(chuàng)建一個新對象;
  2. 把this指向這個對象;
  3. 執(zhí)行構造函數中的代碼,從而將屬性和方法添加到這個對象上;
  4. 返回這個新對象;

因為箭頭函數沒有自己的this,它的this是外層執(zhí)行環(huán)境的this,不能控制該this的指向,所以第二步執(zhí)行時會報錯。
由于箭頭函數不能通過new創(chuàng)建實例,因而也沒有原型對象prototype的需求,所以構造函數也沒有原型對象。

參考文獻:
MDN
箭頭函數與普通函數的區(qū)別總結

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容