【问题标题】:Difference between ()=> and _=> and (_)=> in JS ES6 [duplicate]JS ES6中()=>和_=>和(_)=>之间的区别[重复]
【发布时间】:2019-05-02 05:45:37
【问题描述】:

我注意到当我想写一个胖箭头函数“=>”时,我可以做_=>, ()=>(_)=> 和我的代码功能相同(至少对于我的用例而言)

它们之间有实际区别吗?如果有,我应该使用哪一个?我大部分时间都在使用()=>,但后来有一天我看到有人使用_=> 的代码,我觉得它看起来很酷,所以我也开始使用它。

我看到这篇中型文章https://medium.freecodecamp.org/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26,作者声明您可以使用_=>()=>,但没有说明是否有区别。

【问题讨论】:

  • 下划线是一个有效的标识符,如果存在,可以绑定到一个参数。
  • Is there an actual difference between them - 简短的回答是肯定的,第一个指定没有函数参数,其他指定一个
  • 值得注意的是,您可以使用_=> 而不是()=>,因为无论函数有多少参数,都可以使用任意数量的参数调用 JavaScript 函数。这允许您在不传递参数(例如foo())的情况下调用具有单个参数(_=>)的函数。许多(大多数?)语言不允许这样做。
  • 如果您在项目中使用 lodash / 下划线,_ => {} 可能会成为一个问题。该库将无法在箭头函数主体中访问,因为参数正在遮蔽它。
  • 如果您有一个参数,您可以不使用括号使用它,否则如果您有 0 个参数或 2 个或更多参数,您需要使用括号。这里你只有一个参数,即'_'所以括号不是强制性的。

标签: javascript ecmascript-6


【解决方案1】:

粗箭头函数的一般形式是

(parameter-list) => function-body

如果没有任何参数,则使用一对空括号:

() => {}

如果你只有一个参数,那就是:

(x) => {}

由于_ 是 JavaScript 中的有效标识符,您可以这样做:

(_) => {}

现在,一个特殊的规则适用:如果你只有 一个 参数,你可以跳过括号,所以你得到:

_ => {}

请注意,这仅在您有一个参数时才有效,即对于两个您始终必须指定括号:

(x, y) => {}

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

x => { return x; }

你可以省略花括号和return:

x => x

至少,如果在右侧你不尝试返回一个看起来像这样的对象,这是正确的(这段代码不起作用!):

x => { value: x }

这不起作用的原因是JavaScript无法将它与函数体区分开来,函数体也使用花括号,所以现在你必须将它包裹在括号中:

x => ({ value: x })

我认为关于胖箭头函数的语法你需要知道的几乎所有内容。

【讨论】:

  • Golo,感谢您抽出宝贵时间回答我的问题。现在,当我使用 `_=>` 作为回调函数时,我使用它而不传递参数。
  • 那么这样做没有意义(尽管它仍然可以工作)。您应该使用() => {} 来表明没有预期的参数。
  • 知道了!!这意味着我用错了,因为我没有使用'_'并且我没有传递任何参数!酷!
  • 是的,因为 _=> 中的 _ 本身就是一个参数。
【解决方案2】:

你不应该仅仅因为它看起来很酷就使用它。

_ 通常用于告诉 linter(或读者)您没有故意使用某个参数。

所以如果你有一个带有两个参数的回调并且你只使用第二个参数,你会写(_, arg) => console.log(arg),因为如果你写(foo, arg) => console.log(arg),那么linter会抱怨foo没有被使用。

根据回调的参数数量,某些 API 可能具有不同的行为(expressjs 的中间件就是一个例子),因此如果 API 检查回调的 length 属性,那么您可能需要使用像_ 这样的占位符。

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

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

【讨论】:

    【解决方案3】:

    箭头函数可以接受任意数量的参数,就像“常规”函数一样。当没有参数时,这由() => {} 表示,类似于function() {}。但是,如果您有 正好一个 参数,则可以省略括号。这会导致像 _ => {} 这样的语法,就像你已经注意到的那样——这与 (_) => {} 相同,因为下划线是一个有效的标识符(就像 foo 一样)。

    您的特定情况下的运行时差异似乎没有,因为您(可能)没有传递任何参数,在这种情况下_ 是未定义的。您可以轻松验证这一点:

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

    这并不是说您应该这样做,只是暂时没有任何影响。如果您稍后添加参数,可能会造成严重破坏。

    【讨论】:

    • 哦,不错。现在,当我使用`_=>` 作为回调函数时,我使用它而不传递参数。这意味着我用错了吗?
    • 本身没有错,只是利用了变量默认为undefined这一事实。如果您尝试使用它(如我的回答中的 sn-p),您会看到这种行为。
    • 对?...这里不需要。
    • @ATULSHARMA 这就是我说的? "如果你只有一个参数,但是括号可以省略。"
    猜你喜欢
    • 2017-04-11
    • 2018-04-17
    • 1970-01-01
    • 2011-07-16
    • 2019-12-04
    • 2023-03-19
    • 2021-08-22
    • 2014-08-16
    • 2011-04-08
    相关资源
    最近更新 更多