5.2 Красноречивый Javascript - 3-е издание

Относительно новичок в программировании, ищу объяснение вопроса в главе 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

Ищете пошаговое руководство того, что делает код. Любая помощь в ясном понимании этой проблемы будет полезна.

аааа, эта книга - моя любовь <3, если вы новичок в программировании, я рекомендую вам не делать Eloquent javascript своей первой книгой

Stakvino 03.10.2018 23:25

Что вы не понимаете?

zfrisch 03.10.2018 23:28
value начинается с 3 и на него ссылается n в двух функциях, куда он передается из вызовов.
Patrick Roberts 03.10.2018 23:36

визуально это сбивает с толку, но я пытаюсь осознать это. Вот как я пытаюсь взглянуть на этот цикл 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)»

Spaghetti 03.10.2018 23:47

@Stakvino Что с этим не так? Идеально для начинающих imo.

Bergi 03.10.2018 23:47

@Perchitti Да, функция test возвращает логическое значение. Тест заключается в том, больше ли значение n, чем 0.

Bergi 03.10.2018 23:48

@Bergi: Я не согласен, есть много ресурсов для обучения Js, которые лучше подходят для новичков, чем красноречивый javascript, но если человек хоть немного разбирается в программировании, это отличная книга для изучения Js.

Stakvino 03.10.2018 23:51

@Bergi, какие ресурсы JS вы рекомендуете?

Spaghetti 04.10.2018 00:08

@Spaghetti sitepoint.com/premium/books/… - отличная книга для начинающих

Stakvino 04.10.2018 01:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
9
292
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

«Циклы For» - это встроенная функция, общая для языков программирования, включая JavaScript. Статья в Википедии о них довольно подробный, и я бы начал с него, если бы вы хотели понимать контекст вопроса.

Итак, предлагаемое упражнение состоит в том, чтобы написать функцию на JavaScript, которая, грубо говоря, предоставляет функции, аналогичные встроенному «циклу for».

Процитированное вами решение определяет функцию («цикл»), которая принимает четыре параметра: начальное значение («начало»); функция, которая запускается перед каждой итерацией, чтобы проверить, должен ли цикл останавливаться («тест»); функция, которая будет запускаться после каждой итерации («обновление»); и функция, которая должна выполняться в теле цикла во время каждой итерации («тело»). Затем он использует цикл действительный for для выполнения запрошенных итераций.

Спасибо! Это отличное пошаговое руководство, теперь оно имеет гораздо больше смысла.

Spaghetti 03.10.2018 23:54

О чем говорится в этом ответе, чего еще нет в описании проблемы? Как это объясняет, как работает решение?

Barmar 04.10.2018 00:44

@Barmar По мере того, как я учусь, я хочу более тщательно сформулировать свой код, это очень четко излагает описание. Это не касается решения, однако теперь, когда я прошел через это немного больше. Как ...... Наконец, он вызывает функцию обновления для создания нового значения и начинает с самого начала. .... переводится в это .... value = update(value). ?

Spaghetti 04.10.2018 00:53

@Spaghetti Я поддержал ответ Бармара, поскольку он более подробен, чем мой собственный. Вы должны опубликовать этот дополнительный вопрос относительно value = update(value) к его ответу вместо моего, если он еще не ответил на него там.

Ethan Herbertson 05.10.2018 00:59

Пытаюсь понять это сам, читая это ... но из того, что я понимаю, похоже, автор пытается научить вас одной из двух вещей.

  1. Цикл for состоит из

    for (initialExpression; condition; incrementExpression) { а затем заявление }

  2. Что вы можете создать свою собственную многоразовую настраиваемую функцию цикла, которая может работать как forEach () или как бы вы ни хотели, чтобы она работала.

Спасибо за помощь.

Spaghetti 04.10.2018 00:00
Ответ принят как подходящий

Цикл 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

Spaghetti 04.10.2018 01:05

Решить это с помощью цикла for кажется неудобным, я понимаю, почему вы запутались, как и я - я тоже нуб :)

Вот рекурсивное решение, надеюсь, оно прольет больше света, если вы еще не до конца разобрались:

function loop(value, test, update, execute) {
   if (!test(value)) return; // stop
   execute(value);
 return loop(update(value), test, update, execute);
}

Другие вопросы по теме