Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 163

Как разобрать по полочкам и понять пример

03.10.2018, 19:37. Показов 1371. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
JavaScript
1
2
3
4
5
6
function res(){
  for(var i = 0; i < 10; i++){
   (function(a){ setTimeout(() => {console.log(a)})}(i)) 
  }
}
res();
Помогите разобрать код, без самовызывающейся функции, таймер в цикле накапливается и срабатывает только после того, как выполнится цикл, из-за того что js однопоточный, когда в таймер прийдет переменная, она уже будет равна 10 и таймер накопился 10раз, в итоге 10 раз по 10, когда я её засунул в эту сам-ся функцию, при цикле она запускается и таймер срабатывает на месте сразу, я все правильно понял?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2018, 19:37
Ответы с готовыми решениями:

Как на счет - "Разобрать пример из книги по полочкам?"
Здравствуйте. Я начинаю изучать C#, в прочем, не я один в этом разделе. Прочел небольшую книгу для начинающих, в конце книги есть...

Скриншот экрана. Разобрать код по полочкам
Прокомментируйте, пожалуйста, каждую строку кода. Зачем нужна, что делает и т.д. Код работает корректно и делает скриншот экрана: ...

Разложите пожалуйста по полочкам код (не могу понять)
$connection = new mysqli($db_hostname, $db_username, $db_password, $db_database); if ($connection-&gt;connect_error)...

12
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.10.2018, 20:30
Данный скрипт в цикле заводит 10 таймеров, которые сработают практически одновременно. Только i будет выводиться по возрастанию.
Более наглядно рванут все сразу:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
        function res() {
            for (var i = 0; i < 50; i++) {
                (function (a) {
                    setTimeout(
                        () => { console.log(a) }
                        , 10000
                    )
                }(i))
            }
        }
        res();
Добавлено через 3 минуты
I передается параметром анонимной функции по значению. Поэтому "а" всегда разная.
0
1 / 1 / 0
Регистрация: 13.06.2013
Сообщений: 163
03.10.2018, 20:33  [ТС]
amr-now, я уже понял что тут и как, самовызывающаяся функции запоминает окружение к котором была вызвана, т.е. она запоминает i в тот момент, когда была вызвана, в итоге таймеры скапливаются и выполняются в один момент, но в функциях будет то окружение, в момент которого они были выполнены, т.е. выведет от 0 до 9
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.10.2018, 20:36
Swaer, не запоминает i, а открыто берет в параметр i. Перечень своих аргументов естественно любая функция знает.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
04.10.2018, 16:49
JavaScript
1
2
3
4
5
6
function res(){
  for(let i = 0; i < 10; i++) {
   setTimeout(() => console.log(i)) 
  }
}
res();
есть let для того
https://developer.mozilla.org/... ements/let
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.10.2018, 17:07
Evgen1337, в данном случае var и let не отличаются по смыслу. Оба ключевых слова не выходят по видимости за пределы функции.

Кстати, var прекрасно можно использовать для грязного хака - объявить переменную в for, а потом на голубом глазу продолжать использовать после цикла.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
04.10.2018, 20:04
amr-now, Ок

Это обычный вопрос по javascript:
Цитата Сообщение от Swaer Посмотреть сообщение
она уже будет равна 10 и таймер накопился 10раз, в итоге 10 раз по 10
Без IIFE или let не будет такого эффекта, но это также возможно использовать, если понимать разницу

Но в целом, это все низкоуровневое программирование, это оперирование самими возможностями ЯП, потому что существует зиллиард библиотек на многие вопросы... но ) для этого надо что-то понимать

RFP
https://github.com/Reactive-Extensions/RxJS
https://github.com/mobxjs/mobx
...

FP
https://github.com/lodash/lodash
...
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.10.2018, 20:37
Цитата Сообщение от Evgen1337 Посмотреть сообщение
ез IIFE или let не будет такого эффекта
Абсолютно такой же эффект. Несколько раз вызвали функцию с передачей аргумента по значению. Причем сам аргумент value-типа. То есть целиком копируется в аргумент функции в момент вызова.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
        function res() {
            for (var i = 0; i < 50; i++) {
                addition(i);
            }
        }
 
        function addition(a) {
            setTimeout(
                () => { console.log(a) }
                , 10000
            )
        }
        res();
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
04.10.2018, 20:48
вот тут подробнее почему
https://www.youtube.com/watch?... yUFheng6J0
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.10.2018, 21:00
Evgen1337, в этом примере нет конспирологии )) Замыкание не в месте передачи i. i как раз передается аргументом старым добрым дедовским способом. Поэтому и все цифры разные ))
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
04.10.2018, 21:05
та узбагойся)
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.10.2018, 21:48
Цитата Сообщение от Evgen1337 Посмотреть сообщение
Это обычный вопрос по javascript:
JavaScript
1
2
3
for(var i = 0; i < 10; i++) setTimeout(() => console.log(i), 1000)
 
for(let i = 0; i < 10; i++) setTimeout(() => console.log(i), 1000)
Здесь другой пример, внешне кажущийся похожим на вопрос Swaer, но здесь просто замыкание без передачи аргумента функции.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
05.10.2018, 13:00
amr-now, Я не про это

JavaScript
1
2
3
4
    for (var i = 0; i < 10; i++) setTimeout(() => console.log(`i:${i}`), 1000)
    console.log(i)
    for (let j = 0; j < 10; j++) setTimeout(() => console.log(`j:${j}`), 1000)
    console.log(j)
а про то, что j существует только в scope в for, а если через var она будет объявлена вне scope в for
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2018, 13:00
Помогаю со студенческими работами здесь

Кофемашина Philips Saeco HD 8839, Не могу понять ,как разобрать эту модель?
Пришла в ремонт кофемашина Saeco. Только не могу понять- что за модель. У неё сломана воронка заварного устройства и соответственно...

Как понять книжный пример верстки?
Ниже приведен пример верстки, взятый из книги, в котором непонятен один нюанс. У правого блока шириной 20% установлено обтекание...

Приведите простенький пример с наследованием, чтобы понять, как создавать экземпляр класса
Добрый день. Помогите нубу с наследованием на С++. Суть такова. Мне дано 2 класса. У базового 4 поля. У дочерного 1 поле. В...

Разобрать пример анимации
{Данная программа иллюстрирует применение процедур LockDrawing и Redraw для реализации анимации без мерцания} uses GraphABC; //...

Разобрать пример с Random
господа программисты! разъясните ка что тут происходит?? я не въезжаю... рандом от минус бесконечности и до плюс?? data =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru