【问题标题】:How to use arrow function with || operator如何在 || 中使用箭头功能操作员
【发布时间】:2017-02-09 05:50:38
【问题描述】:

使用 Babel,我可以看到

 callback = () => {};

编译成

callback = function callback() {};

这是我所期望的。但是,当我尝试将其与 || 一起使用时出现错误

callback = callback || () => {}

我希望相当于

 callback = callback || function(){};

为什么这是一个错误?另外,这种熟悉的语法是否有更正确的 ES6 版本?

【问题讨论】:

  • 你不能把它包起来吗callback = callback || (() => {})
  • 以类似的方式,您不能立即调用() => {}();你必须写(() => {})()
  • @1252748,这是经典的XY problem。如果变量未设置,您的中间目标是为变量分配函数,因此您询问||。但是你还没有问过关于你的主要目标的问题:即,这段代码是在什么上下文中编写的?你想解决什么问题?我怀疑有更好的解决方案。
  • @naomik 标题可能有点含糊或误导,但根据我收到的优秀答案,我认为其意图已经很清楚了。
  • @naomik 我只是好奇为什么它不起作用。没有更大的图景。

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

它失败了,因为那只是无效的语法。

使用以下方法使其工作:

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

如果你不这样包装它,它会被解释为你输入了以下内容。但这是无效的语法。

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

要扩展分配的评估,请参阅AssignmentExpression 的规范。它由ConditionalExpressionArrowFunction 组成(或其他一些我将忽略的表达式)。所以解释器会尝试使用你的代码作为条件。但是() 本身在该上下文中是无效的,因为表达式应该在ParenthesizedExpressioninside 中。结果,它将失败。如果您改为将表达式分组为callback || (() => {})LogicalOrExpressions 的两边都是有效的表达式。

【讨论】:

  • 我明白了。但在该表中,() => {} 的优先级在哪里?
  • @1252748 你是对的,MDN链接没有明确指定箭头函数。我在回答中添加了更多上下文,希望对您有所帮助。
  • 很好的解释 - 好像翻译本身在说话:D
  • @str 我已经更新了MDN link,如果你想恢复它。
  • @jib 你的change was reverted,“箭头不是操作符”。
【解决方案2】:

由于运算符优先级,您必须将箭头函数包装在括号中才能使其工作:

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

【讨论】:

  • 优先级是什么?
【解决方案3】:

如果您打算使用|| 为函数的回调参数提供默认值,那么编写起来会更容易

function myfunc(callback = () => { }) {
  callback("Hi 1252748");
}

不需要额外的括号。

【讨论】:

  • 谢谢!我考虑过这一点,但老实说,我发现函数的默认参数看起来太乱了。事实上,我什至不是很喜欢这一切。参数列表中的内容太多了。
  • 当然,但它处理的问题是带有默认值的布尔参数,|| 习语不容易处理。就个人而言,我喜欢默认参数并一直使用它们。
  • "a boolean argument with a default, which can't be easily handled by the || idiom" 你能解释一下你的意思吗? || 如何不容易处理布尔值?
  • 我的意思是,假设你想要一个参数默认为true,然后你写boolParm = boolParm || true,那么即使用户显式传入false,它也会被设置为true .这同样适用于传入的任何虚假值,例如 0""。要处理这种情况,您必须写出boolParm = boolParm === undefined ? true : boolParm;(这实际上是转译器将参数默认转译成的内容)。
  • @torazaburo 我正打算对虚假值发表类似的评论。我同意在这种情况下默认参数要好得多。
猜你喜欢
  • 2021-03-14
  • 2018-12-26
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多