Проблемы с пониманием функций обратного вызова в JS - PullRequest
0 голосов
/ 12 сентября 2018

Так что в настоящее время я обновляю свои знания JS, и немного о функциях обратного вызова сбивает меня с толку.

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

Пример:

const numbers = [1, 2, 3, 4, 5]; 

const bigNumbers = numbers.map(number => {
  return number * 10;
});

см. «Числа» и «число», они оба разные переменные, так как же программа распознает, что «число» относится к единичным данным внутри массива?

Моя проблема в том, что я чувствую, что переменная «число» появляется из ниоткуда, хотя программа, похоже, точно знает, что она делает.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете рассматривать обратный вызов как обычную функцию, вызываемую после того, как что-то происходит. Функция map является одной из самых полезных функций массива. По сути, он просматривает каждое значение в массиве и использует возвращаемое значение вместо исходного значения. Самое приятное, что он не изменяет исходный массив.

Возвращаясь к функции, о которой вы спрашивали. Это может быть легче понять с помощью синтаксиса ES5. Когда map проходит через каждый элемент в массиве, он передает элемент в качестве первого входного параметра в функцию обратного вызова, которая является переменной number, и поэтому он доступен внутри функции.

var bigNumbers = numbers.map(function(number){
  return number * 10;
});
0 голосов
/ 12 сентября 2018

Обратный вызов и его аргументы обрабатываются Array.prototype.map внутри.Чтобы увидеть, как это может работать самостоятельно, вы можете определить свою собственную функцию, которая делает что-то подобное, и вызывает обратный вызов, который ей передается:

function myMap(callback) {
  const inputArr = this;
  const newArr = [];
  for (let i = 0; i < inputArr.length; i++) {
    newArr.push(
      callback(inputArr[i], i, inputArr)
    );
  }
  return newArr;
}

const numbers = [1, 2, 3, 4, 5]; 

const bigNumbers = myMap.call(numbers, number => number * 10);
console.log(bigNumbers);

Аргумент number не возникает из ниоткуда - это аргумент, который вы определяете для функции обратного вызова, которая (для Array.prototype.map) spec гарантирует , что он соответствует элементу в массиве, который перебирается.(Вы можете использовать столько аргументов, сколько пожелаете)

...