从外部函数(数组)了解返回函数(x)

Understanding return function(x) from outer function(array)

本文关键字:函数 返回 数组 从外部 了解      更新时间:2023-09-26

我正在学习JavaScript,对下面的练习有点困惑。我确实需要创建一个过滤器,接受另一个函数作为排序方法。我有点不明白的是for loop是如何将value传递给x的。你能解释一下吗?

function filter(arr, func) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        var value = arr[i];
        if (func(value)) {
            result.push(value);
        }
    }
    return result
}
function inBetween(a, b) {
    return function(x) {
        return a <= x && x <= b;
    }
}
function inArray(arr) {
    return function(x) {
        console.log(x)
        return arr.indexOf(x) != -1;
    }
}
var arr = [1, 2, 3, 4, 5, 6, 7];
alert(filter(arr, function(a) {
  return a % 2 == 0
})); // 2,4,6
alert( filter(arr, inBetween(3, 6)) ); // 3,4,5,6
alert( filter(arr, inArray([1, 2, 10])) ); // 1,2

我将以这一行为例:

filter(arr, inArray([1, 2, 10])) );

inArray是用arr = [1, 2, 10]调用的。

它返回以下(匿名)函数,用于特定的arr

function (x) {
    return arr.indexOf(x) != -1;
}

因此,原来的线路现在可以想象为:

filter(arr, function (x) {
    return [1, 2, 10].indexOf(x) != -1;
});

现在调用过滤器,并将函数设置为该匿名函数。以下代码调用该函数:

    if (func(value)) {
        result.push(value);
    }

因此,当这个func被调用时,这实际上意味着上面的匿名函数被调用,并且参数x在调用时被设置为。这就像任何其他函数调用一样,函数的参数获取实际调用中参数的值。

您的filter函数接受要筛选的数组,以及执行筛选的函数。本部分:

for (var i = 0; i < arr.length; i++) {
    var value = arr[i];
    if (func(value)) { //here, you invoke the function on the array's values
        result.push(value);
    }
}

例如,如果我们看inBetween(3, 6)函数,它是这样的:

return function(x) {
    return 3 <= x && x <= 6;
}

(如果你不理解这一部分,请阅读更多关于闭包的内容)

因此,现在这个函数只是一个接受值并返回true/false的函数,不管它是否在3&6.

使用上面的函数,您最终可以调用数组的每个值(1、2、3…7)。

您列出的所有其他函数也是如此。

在行中:

filter(arr, inBetween(3, 6))

您不是在"传递函数",而是传递函数调用的结果。结果是另一个(匿名/未命名)函数。

从此行:

function filter(arr, func) {

我们知道作为参数传递给filter的函数名为func,那么:

if (func(value)) {

执行此功能。

在JavaScript中,函数和其他对象一样只是一个对象。要区分"函数对象引用"answers"函数调用",可以查找()

inBetween是函数对象引用,inBetween(x, y)表示调用该函数。

匿名函数可以定义、分配给变量,也可以作为参数传递。它也可以在定义后立即执行:

function() {
  alert("called!");
}();

不过,对于刚接触JavaScript的人来说,这可能看起来很奇特。