【问题标题】:Confusing way to invoke JavaScript arrow functions调用 JavaScript 箭头函数的令人困惑的方式
【发布时间】:2019-05-17 21:49:00
【问题描述】:

我遇到了以下代码,它非常简单,因为它旨在确定变量是否为字符串。

const is_string = value => {
  return typeof value() === 'string';
};

let example = 'Hello, world!';

console.log(is_string(() => example)); // true

我的困惑与输入参数的使用有关。特别是参数后面带括号的第二行:value() 和调用函数的方式:is_string(() => example)。后者本身看起来就像一个箭头函数。

我重写了类似的代码

const is_string = (value) => {
  return typeof value === 'string';
};

let example = 'Hello, world!';

console.log(is_string(example)); // true

它的作用几乎相同,那么使用第一个代码的符号的真正区别/优势是什么?在特定情况下有用吗?

提前致谢。

版本:

本次讨论的关键词是Lambda 表达式。我不完全知道代码将函数作为输入参数传递,我不熟悉这种表示法。

【问题讨论】:

  • 在某些情况下它当然很有用,但是在这个情况下呢?嗯,有疑问。请注意,您的 sn-p 不能抛出错误,因此不需要 try catch。
  • 第一个从字面上测试作为参数传入的函数的返回类型是否为字符串,而不是传入的参数是否为字符串,这是第二个测试的内容。这些是完全不同的。
  • 第一个函数似乎是一种模式的部分实现,为了灵活性,函数可以接受一个值或返回一个值的 lambda。例如它本来可以做到的:return typeof (typeof value === 'function' ? value() : value) 在目前的形式下,它看起来没什么用。
  • 接受一个函数作为参数通常是一种相对普遍的做法,但接受一个唯一目的是返回一个您检查类型的值?这……很奇怪。我看不出它在测试框架之外是有用的......即使那样......
  • 感谢@AteşGöral 为您提供的所有 cmets,您帮助我理解了这都是关于 lambda 表达式的。现在我将进一步研究。

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

在第一种情况下,您传递一个函数并评估该函数的返回值是否为字符串。

在后一种情况下,您正在测试参数本身。

如您的示例中所示,它只是一个箭头函数,它返回一个您已经拥有的变量,将其转换为箭头函数是没有意义的,这样做会产生(微小的)一点内存和性能开销。直接传递值无疑是更好的方法。

【讨论】:

  • OP 似乎并没有询问函数的作用。问题更多是关于“为什么”。
  • 但是如果你理解他们的工作,“为什么”不是不言自明吗?
  • @AteşGöral “为什么”是这两个函数是针对不同事物的有效测试,但 OP 感到困惑并认为它们做同样的事情。
  • 感谢 @Tibrogargan 的所有 cmets,您帮助我理解了该代码的真正含义。我的困惑是 lambda 表达式,现在我明白它返回一个结果并且可以传递给其他函数。原谅我的无知。
  • @andres_v 我认为您可能已经成为使用人为示例来解释语言特征的常见做法的受害者。正如雷哈特菲尔德(以及凯文 B)提到的那样,这种方法充其量是奇怪的
猜你喜欢
  • 2019-10-05
  • 2019-08-22
  • 2019-08-18
  • 2014-10-17
  • 1970-01-01
  • 2011-02-03
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多