Как элемент передается в метод обратного вызова в JavaScript?

В настоящее время я изучаю 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? Если бы кто-то мог опубликовать упрощенный пример, это было бы действительно полезно

Что вы имеете в виду под «Я никогда явно не передавал метод Array»? Это прямо здесь: numbers.find. Это Array.prototype.find, где Array - ваш массив (numbers).

Gerardo Furtado 18.05.2018 01:52

Вы вызываете массив find()на, поэтому он знает, что это за массив. Вы разместили рабочий пример - какой еще пример вы ищете?

Mark 18.05.2018 01:53

именно вы указываете функции обратного вызова, какой элемент нужно продолжить, здесь ваш массив числа

HoCo_ 18.05.2018 01:56

Результатом эффективный вызова .find() в массиве является следующий for (let i = 0; i < numbers.length; i++) { if (callback(numbers[i], i, numbers)) return numbers[i] } - однако вы не должны предполагать, что движок JS просто заменяет его этим - это не обязательно. Однако что бы он ни делал, результат будет тот же.

VLAZ 18.05.2018 02:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
4
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы расширить комментарий @ 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

Gerardo Furtado 18.05.2018 02:03

@GerardoFurtado: Я сделал это вики сообщества, поэтому, пожалуйста, не стесняйтесь вносить улучшения.

user2437417 18.05.2018 02:05

Это был действительно полезный и вдохновляющий ответ, большое спасибо!

PacketSniffer 18.05.2018 02:47

Другие вопросы по теме