Относительно новичок в программировании, ищу объяснение вопроса в главе 5 Eloquent Javascript.
Your own loop Write a higher-order function loop that provides something like a for loop statement. It takes a value, a test function, an update function, and a body function. Each iteration, it first runs the test function on the current loop value and stops if that returns false. Then it calls the body function, giving it the current value. Finally, it calls the update function to create a new value and starts from the beginning.
When defining the function, you can use a regular loop to do the actual looping.
loop(3, n => n > 0, n => n - 1, console.info); // → 3 // → 2 // → 1
Ответ:
function loop(start, test, update, body) {
for (let value = start; test(value); value = update(value)) {
body(value);
}
}
loop(3, n => n > 0, n => n - 1, console.info);
// → 3
// → 2
// → 1
Ищете пошаговое руководство того, что делает код. Любая помощь в ясном понимании этой проблемы будет полезна.
Что вы не понимаете?
value начинается с 3 и на него ссылается n в двух функциях, куда он передается из вызовов.
визуально это сбивает с толку, но я пытаюсь осознать это. Вот как я пытаюсь взглянуть на этот цикл function loop(3, n => n > 0, n => n - 1, console.info) { for (let value = 3; 3 => 3 > 0; 3 => 3 - 1) { console.info(3) }, пытаясь сказать это вслух: «пусть значение равно 3, если тест верен, вычтите 1 из n, затем console.info (n)»
@Stakvino Что с этим не так? Идеально для начинающих imo.
@Perchitti Да, функция test возвращает логическое значение. Тест заключается в том, больше ли значение n, чем 0.
@Bergi: Я не согласен, есть много ресурсов для обучения Js, которые лучше подходят для новичков, чем красноречивый javascript, но если человек хоть немного разбирается в программировании, это отличная книга для изучения Js.
@Bergi, какие ресурсы JS вы рекомендуете?
@Spaghetti sitepoint.com/premium/books/… - отличная книга для начинающих



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


«Циклы For» - это встроенная функция, общая для языков программирования, включая JavaScript. Статья в Википедии о них довольно подробный, и я бы начал с него, если бы вы хотели понимать контекст вопроса.
Итак, предлагаемое упражнение состоит в том, чтобы написать функцию на JavaScript, которая, грубо говоря, предоставляет функции, аналогичные встроенному «циклу for».
Процитированное вами решение определяет функцию («цикл»), которая принимает четыре параметра: начальное значение («начало»); функция, которая запускается перед каждой итерацией, чтобы проверить, должен ли цикл останавливаться («тест»); функция, которая будет запускаться после каждой итерации («обновление»); и функция, которая должна выполняться в теле цикла во время каждой итерации («тело»). Затем он использует цикл действительный for для выполнения запрошенных итераций.
Спасибо! Это отличное пошаговое руководство, теперь оно имеет гораздо больше смысла.
О чем говорится в этом ответе, чего еще нет в описании проблемы? Как это объясняет, как работает решение?
@Barmar По мере того, как я учусь, я хочу более тщательно сформулировать свой код, это очень четко излагает описание. Это не касается решения, однако теперь, когда я прошел через это немного больше. Как ...... Наконец, он вызывает функцию обновления для создания нового значения и начинает с самого начала. .... переводится в это .... value = update(value). ?
@Spaghetti Я поддержал ответ Бармара, поскольку он более подробен, чем мой собственный. Вы должны опубликовать этот дополнительный вопрос относительно value = update(value) к его ответу вместо моего, если он еще не ответил на него там.
Пытаюсь понять это сам, читая это ... но из того, что я понимаю, похоже, автор пытается научить вас одной из двух вещей.
Цикл for состоит из
for (initialExpression; condition; incrementExpression) { а затем заявление }
Спасибо за помощь.
Цикл for состоит из 4 частей:
Синтаксис:
for (Initialization; Condition; Repetition) {
Body
}
Итак, в вашем примере инициализация устанавливает текущее значение цикла (переменная value) равным значению, которое было присвоено функции.
Затем Condition выполняет функцию test(value). Цикл for автоматически проверит, возвращает ли он истину или ложь - если он возвращает false, цикл останавливается. Это соответствует требованию:
Each iteration, it first runs the test function on the current loop value and stops if that returns false.
Затем выполняется Body, и это выполняет body(value). Это реализует требование:
Then it calls the body function, giving it the current value.
Затем повторение выполняет value = update(value), который реализует:
Finally, it calls the update function to create a new value and starts from the beginning.
Это хорошо продумано, и это именно то прохождение, которое я искал. Спасибо @Barmar
Решить это с помощью цикла for кажется неудобным, я понимаю, почему вы запутались, как и я - я тоже нуб :)
Вот рекурсивное решение, надеюсь, оно прольет больше света, если вы еще не до конца разобрались:
function loop(value, test, update, execute) {
if (!test(value)) return; // stop
execute(value);
return loop(update(value), test, update, execute);
}
аааа, эта книга - моя любовь <3, если вы новичок в программировании, я рекомендую вам не делать Eloquent javascript своей первой книгой