我正在研究我对函数式编程的理解并有一个问题。
在这个例子中* 一个匿名函数被分配给变量 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/