如何在Javascript .filter()方法中将额外的参数传递给回调函数?

2022-08-30 04:57:46

我想将数组中的每个字符串与给定的字符串进行比较。我目前的实现是:

function startsWith(element) {
    return element.indexOf(wordToCompare) === 0;
}
addressBook.filter(startsWith);

这个简单的函数有效,但只是因为现在wordToCompare被设置为全局变量,但我当然想避免这种情况并将其作为参数传递。我的问题是我不确定如何定义 startsWith(),所以它接受一个额外的参数,因为我并不真正了解它所采用的默认参数是如何传递的。我已经尝试了所有我能想到的不同方法,但没有一个有效。

如果您还可以解释传递给“内置”回调函数的参数(抱歉,我不知道这些函数的更好术语)是如何工作的,那就太好了


答案 1

接受要比较的单词并返回一个函数,然后该函数将用作过滤器/回调函数:startsWith

function startsWith(wordToCompare) {
    return function(element) {
        return element.indexOf(wordToCompare) === 0;
    }
}

addressBook.filter(startsWith(wordToCompare));

另一种选择是使用 Function.prototype.bind [MDN](仅在支持 ECMAScript 5 的浏览器中可用,在较旧的浏览器中,请点击填充程序的链接)并“修复”第一个参数:

function startsWith(wordToCompare, element) {
    return element.indexOf(wordToCompare) === 0;
}

addressBook.filter(startsWith.bind(this, wordToCompare));

我真的不明白它所采用的默认参数是如何传递的

这没什么特别的。在某些时候,只需调用回调并传递数组的当前元素。因此,它是一个调用另一个函数的函数,在本例中是作为参数传递的回调。filter

下面是一个类似函数的示例:

function filter(array, callback) {
    var result = [];
    for(var i = 0, l = array.length; i < l; i++) {
        if(callback(array[i])) {  // here callback is called with the current element
            result.push(array[i]);
        }
    }
    return result;
}

答案 2

filter 的第二个参数将在回调内部设置此参数

arr.filter(callback[, thisArg])

所以你可以做这样的事情:

function startsWith(element) {
    return element.indexOf(this) === 0;
}
addressBook.filter(startsWith, wordToCompare);