javascript - 为什么将匿名函数存储为变量并将其传递给高阶函数是有用的?

标签 javascript functional-programming higher-order-functions

我正在研究我对函数式编程的理解并有一个问题。

在这个例子中* 一个匿名函数被分配给变量 isDog,然后 isDog 被传递给过滤器。然后我们可以将动物数组中的所有狗过滤到一个新数组中。 (我知道我可以缩短这段代码,但这不是这篇文章的重点:))

var animals = [{name: "Spot", species: "dog"}, 
{name: "Rex", species: "dog"}, 
{name: "Whiskers", species: "cat"},
{name: "Floppy", species: "Rabbit"}]

var isDog = function(animal) {return animal.species === 'dog' } 

var dogs = animals.filter(isDog)

我知道函数可以作为参数传递,也许这可以通过将函数分配给变量来明确表示。

但是现在匿名函数是一个变量,我们没有用括号写它,即 isDog(),直觉上这似乎降低了代码的可读性。乍一看,我会假设 isDog 只是一个变量,而不是一个函数。

即使我们可以推断它是一个函数,因为它附加到过滤器,它仍然令人困惑,我假设在其他情况下它并不明显。所以现在我们必须查看 isDog 是什么/做什么。

所以我想问的是为什么要这样做?没有括号的 isDog 看起来确实更优雅,但是以这种方式使用它有任何技术原因吗?

请注意,我理解函数作为参数的强大功能,我的问题更多是关于为什么将它们分配给一个变量,如果它会产生模棱两可的代码。

谢谢。

*改编自这个有用的视频。大约 8 分钟标记,https://www.youtube.com/watch?v=BMUiFMZr7vk

最佳答案

括号仅在您调用函数时出现。如果将带括号的调用传递给 .filter() 方法,则实际上传递的是调用的结果,而不是指向调用本身的指针。另一种方法是将整个函数传递给过滤器函数,但可读性往往会受到影响。它还限制了您修改要放入函数中的内容的能力。

想象一下这样一种情况,您可能想要进行排序而不是筛选,并且您想要根据传入的 bool 值更改排序。

以这种基本排序为例:

var numbers = [4, 2, 5, 1, 3];

numbers.sort(function(a, b) {
  return a - b;
});

如果您希望能够根据另一个变量选择它的排序方向怎么办?您可以定义两个排序函数,然后为您想要的排序传递正确的函数。

var numbers = [4, 2, 5, 1, 3];
var sortAscending = function(a, b) {
  return a - b;
}

var sortDescending = function(a, b) {
  return b - a;
}

function doSort(myArray, dir) {
    var sortMethod = (dir == "asc") ? sortAscending : sortDescending;
    myArray.sort(sortMethod );
}

doSort(numbers, "asc");

上面说明了以这种方式传递方法调用如何在需要时提供更大的灵 active ,并确保仅在排序内部执行时才进行调用。

关于javascript - 为什么将匿名函数存储为变量并将其传递给高阶函数是有用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049033/

相关文章:

javascript - JMESPath 中的动态/计算键?

javascript - 如何多次调用 casper.start()

reactjs - 使用状态来 react 功能组件

scala - 验证数字序列是否在允许的范围内

raku - 如何引用新的?

javascript - 是否有任何高阶函数可以从 javascript 中的对象数组返回对象?

javascript - 为什么 'this' 不是我期望的那样?

javascript - 如何使用 CSS 以 x=50,y=50 为中心旋转一条线(x1=50,y1=50,x2=50,y2=10)?

javascript - 在 8th Wall Web 中以灰度显示摄像头源

programming-languages - 为什么是纯函数式语言而不是 "impure"函数式语言?