发布于 2026-01-06 1 阅读
0

JavaScript 中的箭头函数:你需要了解的一切

JavaScript 中的箭头函数:你需要了解的一切

箭头函数是 JavaScript 中创建函数的另一种方式,它在 ES6 中引入。

它们之所以得名arrow functions,是因为它们是用箭头符号“-”创建的=>

箭头函数的主要优点是语法简洁,这通常能提高代码的可读性。当需要快速创建一个函数并将其作为另一个函数的参数时,箭头函数非常方便。

大多数情况下,它们可以与常规函数互换使用,但需要记住一些区别。

箭头函数是匿名函数,这意味着它们不能有名称。你可以通过将它们赋值给一个变量,然后用这个变量名来调用它们,从而绕过这个限制。

让我们来看一个从普通函数到箭头函数的简单转换。

function add(x, y) {
    return x + y;
}

// we assign an anonymous to a variable
const add = function(x, y) {
    return x + y;
}

// we remove "function" keyword and add an arrow after arguments
const add = (x, y) => {
    return x + y;
}
Enter fullscreen mode Exit fullscreen mode

上面的代码示例展示了三种声明函数的方法。最后一种方法使用了 ` .`。请注意,现在声明函数=>不再需要 ` .` 关键字。此外,我们还在参数列表后添加了 `.`。function=>

箭头函数允许我们使用更简洁的语法。

// returns x + y
const add = (x, y) => (
    x + y
)

// the same function in one line
const add = (x, y) => x + y

// you can skip parentheses when using only one argument
const add1 = x => x + 1
Enter fullscreen mode Exit fullscreen mode

如果你的函数只包含一个元素,return你可以使用箭头函数的简写形式。

您可以省略{ }关键字return,其后的表达式=>将是此函数返回的值。

返回对象时,需要记住添加( )

// this won't work
const createUser = (id, name) => {
    id: id,
    name: name
}
Enter fullscreen mode Exit fullscreen mode

在这种情况下,用于创建对象的花括号会与用于创建函数体的花括号冲突。您需要添加圆括号以确保返回的是一个对象。

const createUser = (id, name) => ({
    id: id,
    name: name
})
Enter fullscreen mode Exit fullscreen mode

使用缩写形式来提高代码可读性

让我们来看看,当从一个函数返回一个函数时,使用箭头函数的简写形式如何提高代码的可读性。

function createAddFunction(number) {
    return function(x) {
        return x + number
    }
}
Enter fullscreen mode Exit fullscreen mode

createAddFunction这是一个创建其他函数的函数。这种模式称为函数柯里化,您可以在“什么是 JavaScript 中的函数柯里化以及何时使用它”一文currying中了解更多信息。例如,您可以使用它来创建一个将数字递增 n 的函数1

const add1 = createAddFunction(1)
add1(5) // 6
Enter fullscreen mode Exit fullscreen mode

利用我们刚刚学到的箭头函数特性,可以简化的定义createAddFunction。让我们来看看如何将其简化为一行代码。

// initial version
function createAddFunction(number) {
    return function(x) {
        return x + number
    }
}

// changing the inner function to arrow function
function createAddFunction(number){
    return x => x + number
}

// changing the outer function to arrow function
const createAddFunction = number => (
    x => x + number
)

// one line version
const createAddFunction = number => x => x + number
Enter fullscreen mode Exit fullscreen mode

常规函数和箭头函数有什么区别?

this在箭头函数中

最重要的区别在于this这两种函数声明类型中的行为方式。

箭头函数不会创建自己的值this,而是使用定义处的值。

JavaScript 中的解释this需要单独写一篇博客文章,但我会举几个例子来说明它们之间的区别。

const logThisOutside = () => {
    console.log(this)
}

function Button() {
    this.name = 'My Button'
    function logThis() {
        console.log(this)
    }
    const logThisArrow = () => {
        console.log(this)
    }

    logThis() // Window
    logThisArrow() // { name: 'My Button' }
    logThisOutside() // Window
}

new Button()
Enter fullscreen mode Exit fullscreen mode

正如你所见logThisArrow,箭头函数会使用定义位置中的logThisOutside值。这是因为与普通函数不同,箭头函数不会创建自己的值,而是使用外部作用域中的值。thisthis

this巧妙运用箭头函数

function Button() {
  this.name = 'My Button'

  const that = this
  document.querySelector("button").addEventListener("click", function() {
    console.log('click', this); // Button DOM Element
    console.log('that', that) // { name: 'My Button' }
    this.name = 'Button Clicked' // won't work as expected
    that.name = 'Button Clicked' // name value changed
  });

  document.querySelector("button").addEventListener("click", () => {
    console.log("click arrow", this); // { name: 'My Button' }
    this.name = 'Button Clicked' // name value changed
  });
}

new Button()
Enter fullscreen mode Exit fullscreen mode

我们创建了两个事件监听器。其中一个使用了普通函数,另一个使用了箭头函数。

在事件监听器中的常规函数​​中,点击按钮后,this其值会是被点击的 DOM 元素的值。如果我们想要改变这个值,this.name必须先创建一个变量const that = this,然后再通过修改它来实现。这是一种常见的从外部作用域that.name = 'Button Clicked'修改值的技巧。this

如前所述,箭头函数不会创建自己的变量,因此您可以安全地通过以下方式this更改值namethis.name = 'Button Clicked

在箭头函数中访问参数

箭头函数的另一个特点是它们不会arguments在函数体内创建特殊变量。

让我们看看arguments它在正常情况下是如何工作的。

function add() {
    console.log(arguments)
}

add(1, 2, 3) // console: [1, 2, 3]
Enter fullscreen mode Exit fullscreen mode

普通函数可以访问一个特殊arguments变量,该变量存储调用该函数时使用的所有参数,即使这些参数没有在括号内定义。

箭头函数不会创建arguments变量,但我们可以使用其他方法来实现相同的目的——使用剩余参数。

const add = (...args) => {
    console.log(args)
}

add(1, 2, 3) // console: [1, 2, 3]
Enter fullscreen mode Exit fullscreen mode

概括

箭头函数提供了一种简洁的语法来创建函数。它允许省略诸如 `and` 和 `or` 之类的关键字functionreturn从而提高代码的可读性。但请注意,过度嵌套的箭头函数会导致代码难以阅读,因此请谨慎使用。

箭头函数不会创建自己的特殊变量,这是它thisarguments普通函数的主要区别。

如果您想了解其他差异,请查看MDN 箭头函数表达式


我定期发布关于网站开发的文章和见解。
欢迎订阅我的电子报
访问我的博客slawkolodziej.com,了解更多精彩内容。也欢迎在Twitter
上关注我

文章来源:https://dev.to/slawomirkolodziej/arrow-functions-in-javascript-everything-you-need-to-know-about-them-5c10