javascript回调函数选择

javascript callback function selection

所以基本上我需要使用我在过滤器函数中实现的每个函数,以便过滤器函数 return myArray 中唯一大于 2 的项目。我完全卡住了。

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

function each(collection, callback) {
    for (var i = 0; i < collection.length; i++) {
        callback(collection[i]);
    }
}

function filter(collection, test) {
    var returnAr = [];
    for (var i = 0; i < collection.length; i++) {
        if (test(collection[i])) {
            returnAr.push(collection[i])
        }
    }
    //instead of using "for(var i  = 0; i < collection.length; i++)"
    // how can i use the each function i implemented above?

    return returnAr;
}

filter(myArray, function(n) {
    return n > 2;
}

你不能。上面的 'each' 函数对集合的所有项目执行回调。但是在 'filter' 中,您要根据回调的结果决定是否需要结果数组中的一个项目。所以 'filter' 和 'each' 都是不同的操作。无论你在当前函数中做什么都是正确的过滤方式。

each 的签名接受一个类似数组的东西,以及一个用元素调用的函数。

function each(collection, callback) {
    for (var i = 0; i < collection.length; i++) {
        callback(collection[i]);
    }
}

看来您的回调应该只是执行此操作:

    if (test(collection[i])) {
        returnAr.push(collection[i])
    }

请注意,collection[i] 是回调的第一个参数。

您的回调将采用以下形式:

function(element) {
    // do stuff
}

如果您真的只想根据您提供的条件过滤数组,这就是您需要的全部代码:

myArray.filter(function(item) { return item > 2 })

each 函数通过将数组中的每个项目作为函数参数传递来调用其回调。因此正确的调用方式是:

each(collection, function(item) {
    if (test(item)) {
       // ...
    }
}

Javascript 并没有提供一种很好的自我记录方式来指定函数签名 [1]。通常这可以通过阅读 API 文档来解决。但是,如果这是您自己的代码并且没有 API 文档,那么您需要查看回调是如何调用的。在这种情况下,它被称为:

callback(collection[i]);

这告诉我们回调函数应该接受一个参数,该参数是数组中的一项。

[1]:也叫原型,不,不是javascript这个词的意思,"prototype"这个词的C意思"prototype"