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

匿名函数、命名函数和箭头函数

匿名函数、命名函数和箭头函数

首先,你学习了创建函数的语法,这很好。然后你开始听说匿名函数,它们看起来有点不一样,你不太明白为什么需要它们。接着箭头函数出现了,你彻底懵了……至少我当时是这样的。为了更好地理解这三者的区别,我需要把它们放在一起比较。

这是一个命名函数,也称为函数声明。

function brag(count) {
     return("I can do " + count + " pushups");
} 

console.log(brag(3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

这是一个匿名函数,也称为函数表达式。

var brag = function(count) {
     return("I can do " + count + " pushups");
} 

console.log(brag(3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

这是一个箭头函数,一种特殊的函数表达式

var brag = (count) => ("I can do " + count + " pushups");

console.log(brag(3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

它仍然是一个函数表达式,因为右侧的所有内容=都是我们分配给变量的值brag

注意:(1) 代码块没有使用花括号,(2) 也没有return语句。这是因为箭头函数具有隐式返回值,也就是说值会自动返回。实际上也不需要任何圆括号,但我保留了它们,因为它们使代码更易读。

除了语法之外,它们还有哪些不同?

函数声明会被提升,这意味着它们会在编译时被加载到内存中。这就是为什么在下面的例子中,即使函数声明尚未出现,函数调用也能正常工作。

console.log(brag(3)) // I can do 3 pushups

function brag(count) {
     return("I can do " + count + " pushups");
} 

console.log(brag(3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

另一方面,匿名函数不会被提升。正如你所看到的,当我们在函数声明之前调用“brag”函数时,会报错。而当我们在声明之后调用它时,则可以正常工作。

console.log(brag(3)) // TypeError: brag is not a function

var brag = function(count) {
     return("I can do " + count + " pushups");
} 

console.log(brag(3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

为什么你会使用匿名函数而不是命名函数?

有时候,你不需要给函数命名,因为你只是把它用作另一个函数的回调函数。由于你不会在其他地方再次使用它,所以它不需要名字

例如,这里我们使用了一个名为“brag”的命名函数(也称为函数声明):

function brag(count) {
     return("I can do " + count + " pushups");
} 

console.log(brag(3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

但我们也可以像这样将其匿名化:

console.log(function(count) {
     return("I can do " + count + " pushups");
} (3)) // I can do 3 pushups
Enter fullscreen mode Exit fullscreen mode

为什么你会使用箭头函数而不是匿名函数?

我以前一直认为箭头函数只是匿名表达式的更简洁的替代方案。但Ben Calder正确地指出,“箭头函数会保留其上下文this,这解决了之前需要使用闭包或 `if` 语句才能解决的一些非常棘手的作用域问题bind(this)。MDN文档中对此有一些讨论。” 总之,当你this在箭头函数中使用 `if` 时,它始终会保持其上下文不变,而不会在运行时将其更改为意外的内容。

在评论中,Angela提到你可以点击这里阅读“关于箭头函数不同之处的更多信息”。感谢Ben和Angela提醒我更新这篇文章!

文章来源:https://dev.to/mathlete/anonymous-functions-vs-named-functions-vs-arrow-functions-57pm