Заставить 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;
}