В настоящее время я изучаю JavaScript, и меня немного смущает, как работает функция обратного вызова для метода Array.find(),
У меня есть текущий код:
const numbers= [43,46,33,23,44,36,5]
function under50(num) {
return num < 50;
}
val = numbers.find(under50);
Согласно Mozilla Docs:
Перезвоните Функция, выполняемая для каждого значения в массиве, с тремя аргументами:
элемент
Текущий обрабатываемый элемент в массиве.
Индекс
Индекс текущего обрабатываемого элемента в массиве.
Множество
Был вызван поиск массива.
Теперь, чтобы понять метод, которым я передаю элемент, он затем повторяется, и как только элемент найден, он вернет значение. Однако меня смущает то, как он узнает элемент, если я никогда явно не передавал метод Array? Если бы кто-то мог опубликовать упрощенный пример, это было бы действительно полезно
Вы вызываете массив find()на, поэтому он знает, что это за массив. Вы разместили рабочий пример - какой еще пример вы ищете?
именно вы указываете функции обратного вызова, какой элемент нужно продолжить, здесь ваш массив числа
Результатом эффективный вызова .find() в массиве является следующий for (let i = 0; i < numbers.length; i++) { if (callback(numbers[i], i, numbers)) return numbers[i] } - однако вы не должны предполагать, что движок JS просто заменяет его этим - это не обязательно. Однако что бы он ни делал, результат будет тот же.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы расширить комментарий @ GerardoFurtado, значение this внутри метода .find() устанавливается в ваш массив. Таким образом, у него есть как массив, так и функция обратного вызова. Затем он в основном создает эквивалент типичного цикла for и вызывает ваш обратный вызов в этом цикле, передавая каждому члену.
Чтобы дать простой пример, создайте свой собственный метод .find().
// Be careful extending native prototypes
Array.prototype.myFind = function(callback) {
for (var i = 0; i < this.length; i++) {
if (callback(this[i], i, this)) {
return this[i]; // callback result was "truthy" so return this item
}
}
return undefined; // not found, so return undefined
}
const numbers = [43,46,33,23,44,36,5]
function under50(num) {
return num < 50;
}
const val = numbers.myFind(under50);
console.info(val);Это довольно упрощено и не демонстрирует того же поведения, что и стандартный метод, но его достаточно, чтобы показать, как использовать this в качестве ссылки на объект, для которого был вызван метод.
Для полноты вы можете спросить, откуда JavaScript знает, что ваш массив имеет свойство (в данном случае метод) с именем find. Очевидно, что это не так. Но JavasCript будет искать find в цепочке прототипов. Взглянуть:
const numbers= [43,46,33,23,44,36,5];
console.info("find" in numbers)Вы также можете указать это в своем ответе, чтобы показать, что свойство просматривается в цепочке прототипов: jsfiddle.net/8s0Ljbhh
@GerardoFurtado: Я сделал это вики сообщества, поэтому, пожалуйста, не стесняйтесь вносить улучшения.
Это был действительно полезный и вдохновляющий ответ, большое спасибо!
Что вы имеете в виду под «Я никогда явно не передавал метод Array»? Это прямо здесь:
numbers.find. ЭтоArray.prototype.find, гдеArray- ваш массив (numbers).