javascript回调函数选择

时间:2015-03-25 05:43:20

标签: javascript arrays function callback closures

所以基本上我需要使用我在filter函数中实现的每个函数,这样过滤器函数只返回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;
}

4 个答案:

答案 0 :(得分:0)

你不能。每个&#39;上面的函数对集合的所有项执行回调。但是在&#39;过滤器&#39;您是根据回调的结果决定是否需要结果数组中的项目。所以&#39;过滤&#39;和&#39;每个&#39;都是不同的行动。无论你在当前函数中做什么都是正确的过滤方式。

答案 1 :(得分:0)

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
}

答案 2 :(得分:0)

如果你真的只想在你提供的条件下过滤数组,这就是你需要的所有代码:

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

答案 3 :(得分:0)

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

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

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

callback(collection[i]);

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

[1]:也称为原型,不,不是在javascript意义上的“原型”这个词,在C语言中的意思是“原型”