如何使用箭头函数与 || 运算符

8
使用 Babel,我可以看到:
 callback = () => {};

编译成

callback = function callback() {};

这正是我所期望的。然而,当我尝试与||一起使用时,出现了错误。
callback = callback || () => {}

我预期这与以下内容等效:

 callback = callback || function(){};

为什么会出现这个错误?同时,是否有更正确的ES6版本来替换这个熟悉的语法?

3
你可以这样简化 callback = callback || (() => {}) - adeneo
2
同样地,你不能立即调用 () => {}();你必须写成 (() => {})() - user663031
1
@1252748,你所遇到的问题是一个经典的XY问题。你的中间目标是当变量未设置时将函数赋值给变量,因此你询问了||。但你仍然没有就你的主要目标提出问题:即这段代码所编写的上下文是什么?你试图解决什么问题?我怀疑有更好的解决方案。 - Mulan
1
@naomik 标题可能有点模糊或误导性,但基于我收到的优秀答案,我认为意图已经非常清楚地被理解了。 - 1252748
1
@naomik 我只是好奇为什么它没起作用。没有更大的背景。 - 1252748
显示剩余3条评论
3个回答

8

失败是因为这不是有效的语法。

使用以下方法使其工作:

callback = callback || (() => {})

如果您不以此方式包装它,将被解释为您键入了以下内容。但那是无效的语法。

callback = (callback || ()) => {}

为了扩展作业的评估,请参考AssignmentExpression规范。它由一个ConditionalExpressionArrowFunction(或者我将忽略的其他表达式)组成。因此,解释器会尝试将您的代码用作条件语句。但是,在该上下文中,()本身不是有效的,因为需要在ParenthesizedExpression内部使用表达式。
结果,它将失败。如果您将表达式分组为callback || (() => {}),则LogicalOrExpressions的两侧都是有效的表达式。

1
我明白了。但是在那个表格中,() => {} 的优先级在哪里? - 1252748
@1252748 你说得对,MDN链接并没有明确指定箭头函数。我在我的回答中添加了更多的上下文,希望能有所帮助。 - str
1
良好的解释 - 就像解释器本身在说话一样:D - user6445533
@str 我已经更新了MDN链接,如果你想要重新获取它。 - jib
@str 我的错误。关于你的解释,我认为解析不依赖于 () 不是一个有效的表达式,因为我可以将箭头函数替换为 x => x*2 并且在作用域中有一个有效的 x,但它对我来说仍然会产生相同的错误。一个更通用的答案可能会更有帮助。 - jib
显示剩余2条评论

5

由于运算符优先级,您需要将箭头函数用括号括起来才能使其正常工作:

callback = callback || (() => {})

6
什么是优先级? - user663031

3
如果您计划使用||为函数的回调参数提供默认值,则只需编写以下内容即可:
function myfunc(callback = () => { }) {
  callback("Hi 1252748");
}

不需要额外的括号。

谢谢!我考虑过这个,但说实话,我觉得函数的默认参数看起来太凌乱了。事实上,我并不是很喜欢它。在参数列表中有太多东西了。 - 1252748
当然可以,但它涉及到一个布尔参数的默认值问题,这个问题不能很容易地通过“||”习惯用法来处理。就我个人而言,我非常喜欢默认参数,并且经常使用它们。 - user663031
“一个带有默认值的布尔参数,无法轻松处理 || 习语。” 你能解释一下你的意思吗?为什么 || 不容易处理布尔值? - 1252748
3
假设您想将一个参数默认设置为true,您可以编写 boolParm = boolParm || true,这样即使用户明确传递false,它也会被设置为true。同样适用于任何传递的falsy值,例如0""。如果要处理这些情况,则需要编写boolParm = boolParm === undefined ? true : boolParm;(实际上这就是翻译器将参数默认值转换成的代码)。 - user663031
@torazaburo 我正要发表类似的评论,关于 falsy 值。我同意在这种情况下默认参数更好。 - Mulan
说实话,我也不确定默认的回调/继续会是什么样子。唯一想到的就是使用 id 的东西,例如:Array.from = function(iterable, mappingFunc = x => x) { ... }。这只是让我想到了其他问题。我希望我们能看到原帖作者的真实代码的其余部分。 - Mulan

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