Как элемент передается в метод обратного вызова в JavaScript? - PullRequest
0 голосов
/ 18 мая 2018

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

1 Ответ

0 голосов
/ 18 мая 2018

Чтобы развернуть комментарий @ 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.log(val);

Это довольно упрощенно и не демонстрирует все то же поведение, что и стандартный метод, но достаточно, чтобы показать, как использовать this в качестве ссылки на объектдля которого был вызван метод.

Для полноты вы можете спросить, откуда JavaScript знает, что у вашего массива есть свойство (в данном случае метод) с именем find.Очевидно, это не так.Но JavasCript будет искать find в цепочке прототипов.Посмотрите:

const numbers= [43,46,33,23,44,36,5];
console.log("find" in numbers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...