Часть II « Странные вопросы за первый месяц программирования»

Когда вы изучаете методы JavaScript, люди часто упоминают «обратные вызовы». Мне потребовалось некоторое время, чтобы понять их, и вот как мне удалось их понять. В этом посте мы попытаемся объяснить обратные вызовы в контексте метода фильтра.

Возможно, вы уже знаете, что методы — это замаскированные функции. Некоторые методы, такие как фильтр, требуют другой функции. Поэтому, когда вы используете фильтр, вы фактически запускаете функцию внутри другой функции (обратный вызов). В терминах, столь же широких, как лес Амазонки, это и есть обратный вызов: функция внутри другой функции. Точнее, обратный вызов — это функция, которая передается в качестве аргумента, но эти термины были намного выше моего понимания новичка.

Ну, читай документацию, ага. Да, хорошая идея:

Однако все не должно быть так сложно. Давайте переведем это на настоящий язык начинающих:

array.filter(function doSomething (value,index,array){whatever you need to do})

Обратите внимание, что параметры, выделенные курсивом, являются необязательными.

В первые несколько недель мне просто было интересно, что, черт возьми, я должен написать в качестве обратного вызова, и, что более важно: откуда берутся все эти параметры?!?!

Давайте исследуем

Я начну с подробного примера, а затем отрефакторю его, чтобы сделать его более читабельным:

Видеть? Не нужно заморачиваться, просто верните то, что хотите.

Хорошо, но откуда моя функция узнает, что этот параметр является значением? И откуда берется это значение?

Хорошая вещь о методах заключается в том, что они имеют предопределенный способ передачи данных обратному вызову. В случае фильтра он передаст значение элемента массива (например, «Марс») в качестве первого параметра обратного вызова, а затем индексэлемента массива. и, наконец, сам массив . Это происходит всегда в этом порядке.

Это означает, что если вы напишите planets.filter(planet => planet.startsWith("M") (заменив слово value на planet), ваша функция все равно будет работать, потому что важно не имя параметра, а фактическое значение, которое он передает. И не волнуйтесь, метод фильтра сам справится с итерацией, он автоматически отправит значение и индекс каждого элемента вашего массива, вам не нужно беспокоиться о цикле.

Давайте посмотрим на другой пример, где полезен параметр index:

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

Но я вижу, что вы не убеждены. Вы хотите удалить первый аргумент (значение), потому что вы не будете его использовать. Что происходит тогда?

Вы получите пустой массив. Почему? Метод фильтра интерпретирует этот один (следовательно, первый) параметр как value, несмотря на то, как вы его назвали. Когда первый/единственный параметр попадает в обратный вызов, он будет обрабатываться так, как если бы это было значение, а не индекс. Период. В данном случае, поскольку наше значение представляет собой строку, говорить, что Mercury меньше двух, немного бессмысленно. JavaScript сообщит вам, что результат равен false, и вы получите пустой массив. (Помните, что фильтр возвращает только true оценок).

Теперь пример с массивом чисел:

Если вам интересно научиться рефакторингу, мой друг Букола написал об этом хороший пост ;)

TL;DR;

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

Серия Странные вопросы из моего первого месяца программирования
Часть I: Как индексы и значения массива работают в циклах for
Часть III: Сравнение методов итерации JS