forEach() мне тоже приходилось использовать, только итератором я его не называла, т.к. он сильно похож на мой любимый for .
Пра forEach() - не только меня поставило в небольшой ступор задание контрольной (или челенджа, конкурса, как его называют на сайте академии).
Мы то понимаем, как работает этот метод, да и на
MDN - forEach есть полное описание и самого метода и как с ним работать.
Однако, непонятки с заданием возникли не только у меня, так как к странице с заданием прикрепили ссылку на тему форума, открытую недовольными учениками, закидавшими админку вопросами и претензиями (вы нас этому не научили. Не понятно чего вы хотели, пишите задание более внятно и т.д.).
Сейчас приведу задание в переводе на русский (оригинал на англ):
Напишите функцию:declineEverything(),
которая принимает массив строк и, используя .forEach(), перебирает каждый элемент массива и
вызывает politelyDecline() для каждого из них.
Функция .forEach() должна напрямую применять politelyDecline();
он НЕ должен просто получать функцию аргумента, которая использует politelyDecline().
Вы можете протестировать свою функцию, когда будете готовы, передав ей массив овощей или создав собственный массив!Нам дано://массив:const veggies = ['broccoli', 'spinach', 'cauliflower', 'broccoflower'];
//функция, которую нужно вызвать через .forEach() :const politelyDecline = (veg) => {
console.log('No ' + veg + ' please. I will have pizza with extra cheese.');
};
// Write your code here:--Ну и все или многие поголовно написали - как нас учили (было на занятиях и часто повторялось) - callback функции вызывать. То есть, чем запесочили мозги.
Жмешь на кнопочку проверить - и О Ужжжас!!
Тест не пройден!Открываем вкладку с подсказкой (мы то думали что просто, как семечки... и в нее не заглянули ранее)...
И что там видим?
подсказка :Если вам нужно освежить знания о .forEach(), ознакомьтесь с этим упражнением и документацией MDN.
Ваша функция должна иметь параметр массива. Вы вызовете forEach() для переданного массива.
Каким должен быть ваш аргумент для функции forEach() ?
Обратите внимание, что мы хотим, чтобы politelyDeclined() передавался непосредственно в качестве аргумента .forEach()Here’s an example of code that WILL NOT pass our tests:
Вот пример кода, который НЕ ПРОЙДЕТ наш тест:const declineEverything = arr => {
arr.forEach(element => politelyDecline(element));
}
****
[/color]
У многих честно говоря ступор произошел. Потому что именно так мы все и написали. Как на уроках и никак иначе..
Стрелками или обычным способом - воткнули вызываемую функцию подобным образом.
И можно перерыть ссыль на
MDN приведелнную выше - вы там не найдете какого то иного способа, воткнуть вызываемую функцию как то иначе... потому что практически все примеры написаны вот в таком стиле :
первый же пример который вам выдаст страница :
const array1 = ['a', 'b', 'c'];
array1.forEach((element) => console.log(element));// Expected output: "a"
// Expected output: "b"
// Expected output: "c"
где console.log() - вызываемая callback функция( функция обратного вызова)..
Только на страницах форума академии по теме именно этого теста - многие из нас поняти, чего от нас требуется..
что то такое :
function declineEverything(arr) {
arr.forEach(politelyDecline);
}
Ну и далее - пояснение, нам непонятливым:
politelyDecline — это переменная, указывающая на функцию. Это значит, что
strArray.forEach(politelyDecline);
равен вот этому:
strArray.forEach((veg) => {console.log(‘No ’ + veg + ’ please. I will have pizza with extra cheese.’});***
Мне даже не пришлось ничего писать, так как народ это сделал за меня, вот комментарий с форума, в переводе, буквально вырванный из моих уст:
"на самом деле мне трудно понять эту логику, и объяснение, похоже, не прояснило мою путаницу, и я надеюсь на некоторую дополнительную ясность.
Я понимаю, что переменная «politelyDecline» была передана в .forEach() в качестве аргумента, но «politelyDecline» — это функция, которая сама принимает один аргумент. Когда он был передан в качестве аргумента .forEach(), мы не передавали ему никаких аргументов.
Более того, как к нему передавался каждый «овощ» (из массива), если ему передавалась
только функциональная переменная?
Именно это меня озадачивает, и чтение документации MDN не проясняет мне ситуацию, поскольку этот пример использования, похоже, не обсуждается.
Синтаксис, который я бы использовал, который был неверным для этого примера, согласно тексту в вопросе, был: «strArray.forEach(veg => politelyDecline(veg));»
Этот синтаксис имеет для меня смысл, поскольку .forEach анализирует один «овощ» из массива и использует обратный вызов politelyDecline, передавая ему каждый «овощ» в качестве параметра.
Если кто-то сможет лучше объяснить, как это работает, мы будем очень признательны."И дейтвительно,если перерыть всю страницу с документацией MDN, то можно таки найти нечто похожее, хотя реально способ никак не обращает на себя внимания, и задан в другом контексте:
из документации : "Печать содержимого массива
Примечание. Чтобы отобразить содержимое массива в консоли, вы можете использовать console.table(), который печатает отформатированную версию массива.
Следующий пример иллюстрирует альтернативный подход с использованием forEach().
Следующий код регистрирует строку для каждого элемента массива:" - что никак не соотносится у нас с заданием и их претензиями к коду. Никакого упоминания, что тут какая то
"прямая" передача функции, которую от нас требуют.
JS
const logArrayElements = (element, index /*, array */) => {
console.log(`a[${index}] = ${element}`);
};
// Notice that index 2 is skipped, since there is no item at
// that position in the array.
[2, 5, , 9]
.forEach(logArrayElements);// Logs:
// a[0] = 2
// a[1] = 5
// a[3] = 9
***
Следующий ответ - комментарий учащегося, претендует на то, что бы объяснить нам получше, как же так происходит и почему можно вызвать функцию через .forEach()
НЕ передавая ей ее аргумента:
"Итераторы, такие как Array.forEach(), имеют собственную внутреннюю переменную-итератор. Обратный вызов должен быть только ссылкой на объект функции. Итератор обрабатывает вызов функции один раз для каждого значения в массиве.
Когда он был передан в качестве аргумента .forEach(), мы не передаем ему никаких аргументов."Вот честно, мне яснее не стало. Как это никогда не передаем, если передавали постоянно, передавая функцию как callback?
Далее, на подобныей вопросы - чел ответил:
"а так вы еще не проходили классы Javascript?
Это прояснит вам по поводу встроенной в вызываемый класс функциональности...
Ну подождите немного, вот пройдете и вам все станет понятно !"Тут все и присели молча....
Нормально да?