首頁  >  文章  >  web前端  >  JavaScript普通函數和箭頭函數有什麼差別?

JavaScript普通函數和箭頭函數有什麼差別?

不言
不言轉載
2019-04-11 10:59:052615瀏覽

這篇文章帶給大家的內容是關於JavaScript普通函數和箭頭函數有什麼不同?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

我常常的使用箭頭函數,卻還沒有對箭頭函數有個深入的了解,現在找一下這2個函數的不同點

1. 箭頭函數本身沒有prototype(原型)

由於箭頭函數沒有原型,因此箭頭函數本身沒有this

let a = () => {}
console.log(a.prototype) // undefined
let b = function () {}
console.log(b.prototype) // Object

2. 箭頭函數的this指向在定義的時候繼承自外層第一個普通函數的this

let a;
let barObj = {
    msg: 'bar的this指向'
}
let fooObj = {
    msg: 'foo的this指向'
}
bar.call(barObj)
foo.call(fooObj) // { msg: 'bar的this指向'  }
bar.call(fooObj)
a() // { msg: 'foo的this指向' }

function foo() {
    a()
}
function bar () {
    a = () => {
        console.log(this)
    }
}

從上面例子可以得到:

箭頭函數的this指向定義時所在的外層第一個普通函數,跟使用位置沒有沒有關係

被繼承的普通函數的this指向改變,箭頭函數的this也會跟著改變。

不能直接修改箭頭函數的this

可以透過修改被繼承的普通函數的this指向,然後箭頭函數的this也會跟著改變

3. 箭頭函數使用arguments

let b = () => {
        console.log(arguments);
    }
    b(1,2,3,4) // arguments is not defined

    function bar () {
        console.log(arguments);  // 完成第二个普通函数
        bb('完成第一个普通函数')
        function bb() {
            console.log(arguments); // 完成第一个普通函数
            let a = () => {
                console.log(arguments); // 完成第一个普通函数
            }
            a('箭头函数')
        }
    }
    bar('完成第二个普通函数')

從上面可以得到以下2點

  1. 箭頭函數指向window時,arguments會報未定義的錯誤
  2. 如果不是window,那麼就是外層第一個普通函數的arguments

4. 箭頭函數不可以使用new

無論箭頭函數的this指向哪裡,使用new呼叫箭頭函數都會報錯,箭頭函數沒有建構子

let a = () => {}
    let b = new a() // a is not a constructor

【相關推薦:JavaScript影片教學

以上是JavaScript普通函數和箭頭函數有什麼差別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除