我注意到,当我想编写粗箭头功能“ => ”时,我可以执行"
,_=>
或()=>
,并且我的代码具有相同的功能(至少对于我的用例而言)
两者之间是否有实际区别?如果是,我应该使用哪个?我大多数时候一直在使用(_)=>
,但是随后有一天,我看到某人使用()=>
的代码,并认为它看起来很酷,所以我也开始使用它。
我看到了这篇https://medium.freecodecamp.org/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26中等文章,作者在其中指出您可以使用_=>
或_=>
,但没有指定是否有区别。
答案 0 :(得分:11)
胖箭头函数的一般形式是
(parameter-list) => function-body
如果没有任何参数,请使用一对空括号:
() => {}
如果只有一个参数,则为:
(x) => {}
由于_
是JavaScript中的有效标识符,因此您可以执行以下操作:
(_) => {}
现在,有一条特殊的规则适用:如果只有一个 参数,则可以跳过括号,这样您就可以得到:
_ => {}
请注意,这仅在您具有单个参数时才有效,即对于两个参数,您始终必须指定括号:
(x, y) => {}
现在,如果您的整个函数仅由带有return
的单个语句组成,例如
x => { return x; }
您可以省略花括号和return
:
x => x
至少,如果在右侧您不尝试返回一个看起来像这样的对象(此代码无效!),则为true:
x => { value: x }
之所以不起作用,是因为JavaScript无法将其与函数主体(也使用花括号)区分开来,因此现在您必须将其包装在括号中:
x => ({ value: x })
我认为您几乎需要了解有关粗箭头功能语法的所有内容。
答案 1 :(得分:4)
您不应该仅仅因为它看起来很酷就使用它。
_
通常用于告诉linter(或读者)您没有故意使用某个参数。
因此,如果您有一个带有两个参数的回调,而仅使用第二个参数,则您将编写(_, 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)
答案 2 :(得分:1)
箭头函数采用任意数量的参数,就像“常规”函数一样。如果没有参数,则用() => {}
表示,类似于function() {}
。但是,如果您有一个精确的参数,则可以省略括号。正如您所注意到的,这将导致类似于_ => {}
的语法-这与(_) => {}
相同,因为下划线是有效的标识符(就像foo
一样。)
在特定情况下,运行时差异似乎没有,因为(大概)没有传递任何参数,在这种情况下_
是未定义的。您可以轻松地验证这一点:
const foo = _ => console.log(_);
foo(5); // logs 5
foo(); // logs undefined
这并不是说您应该这样做,只是暂时不会有所作为。如果以后添加参数,可能会造成严重破坏。