JS ES6中 ()=>、_=> 和 (_)=> 之间的区别

6
我注意到当我想写一个箭头函数"=>"时,我可以使用_=>()=>(_)=>,它们的功能(至少对于我的用例)非常相似。 它们之间是否存在实际区别? 如果是,应该使用哪一个? 我大多数时候都使用 ()=>,但有一天我看到别人的代码使用了_=>,觉得很酷,所以也开始使用它了。
我看过这篇中等程度的文章https://medium.freecodecamp.org/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26,作者指出可以使用_=>()=>,但没有说明它们之间是否有区别。

1
下划线是一个有效的标识符,如果存在参数,则可以将其绑定到参数。 - jhpratt
1
它们之间是否有实际区别?简短的回答是有,第一个指定没有函数参数,其他则指定一个。 - Jaromanda X
3
值得注意的是,您可以使用 _=> 替换 ()=>,因为 JavaScript 函数可以使用任意数量的参数进行调用,而不管函数有多少个参数。这允许您以单个参数(_=>)调用函数而不传递参数(例如,foo())。许多(大多数?)语言不允许这样做。 - Felix Kling
1
如果您只有一个参数,则可以在不使用括号的情况下使用它;否则,如果您有0个参数或2个及以上参数,则需要使用括号。在这里,您只有一个参数,即“_”,因此括号不是必需的。 - ATUL SHARMA
1
@ATULSHARMA 为什么你要重复多次在多个答案中已经提到的内容? - jhpratt
显示剩余6条评论
3个回答

13

一个fat-arrow函数的一般形式如下:

(parameter-list) => function-body
如果你没有任何参数,你需要使用一对空括号:
() => {}

如果您只有一个参数,它是:

(x) => {}

由于在JavaScript中_是一个有效的标识符,所以你可以这样做:

(_) => {}

现在有一个特殊规则:如果您只有一个参数,可以省略括号,如下所示:

_ => {}

请注意,此规则仅适用于单个参数情况,即对于两个参数,您始终需要指定括号:

(x, y) => {}

现在,在右侧,如果您的整个函数只包含一个带有 return 的语句,例如:

x => { return x; }

你可以省略大括号和 return:

x => x

至少,在右侧不尝试返回一个对象的情况下,这是正确的,这将类似于以下内容(此代码将无法正常工作!):

x => { value: x }
这不起作用的原因是JavaScript无法区分这个代码段和函数体,因为它们都使用花括号,所以现在你需要将其放在括号中:
x => ({ value: x })

我认为这就是有关箭头函数语法的几乎所有需要知道的内容。


Golo,感谢您抽出时间回答我的问题。现在,当我使用_=>作为回调函数时,我是不传递参数的。 - Patricio Vargas
1
那么这样做就没有意义了(尽管它仍然可以工作)。你应该使用 () => {} 来表示不需要参数。 - Golo Roden
明白了!这意味着我使用不正确,因为我没有使用下划线并且没有传递任何参数!太棒了! - Patricio Vargas
是的,因为 _ 在 _=> 中本身就是一个参数。 - BrianFreud

5

不要仅仅因为某个东西看起来很酷就使用它。

_ 经常用来告诉代码检查工具(或读者)你有意不使用某个参数。

所以,如果你有一个带有两个参数的回调函数,而你只使用了第二个参数,那么你应该写成(_, arg) => console.log(arg),因为如果你写成(foo, arg) => console.log(arg),那么代码检查工具会抱怨 foo 没有被使用。

一些API可能会根据回调函数的参数个数而有不同的行为(例如expressjs中间件),因此,如果API检查回调函数的 length 属性,那么你可能需要使用占位符 _

var cb1 = _ => {};
var cb2 = () => {};

console.log(cb1.length)
console.log(cb2.length)


1
箭头函数可以像“常规”函数一样接受任意数量的参数。当没有参数时,使用() => {}表示,类似于function() {}。但是,如果您只有一个参数,则可以省略括号。这会导致类似于_ => {}的语法,就像您注意到的那样 - 这与(_) => {}相同,因为下划线是有效的标识符(就像foo)。
在您特定情况下的运行时差异似乎不存在,因为您(可能)没有传递任何参数,在这种情况下_未定义。您可以轻松验证此操作:

const foo = _ => console.log(_);
foo(5); // logs 5
foo(); // logs undefined

这并不是说你应该这样做,只是目前来看它并没有什么影响。如果稍后添加了参数,可能会造成严重后果。


哦,太好了。现在,当我使用_=>作为回调函数时,我没有传递参数使用它。这意味着我使用它是错误的,对吗? - Patricio Vargas
1
不是本质上的错误,只是利用了变量默认情况下为 未定义(undefined) 的事实。如果您尝试使用它(如我回答中的片段),您将会看到这种行为。 - jhpratt
1
不需要在这里。 - Golo Roden
1
@ATULSHARMA 这就是我说的吗?“如果你只有一个参数,那么括号可以省略。” - jhpratt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接