Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 19.09.2017
Сообщений: 46

Не понятно почему

22.02.2020, 09:56. Показов 1824. Ответов 2

Студворк — интернет-сервис помощи студентам
JavaScript
1
2
3
4
5
6
7
8
9
10
function test2(){
    var cbs = [];
    for (var i = 0; i < 5; ++i){
        cbs.push(function() { console.log(i); });
    }
 
    cbs.forEach(function(item, i, arr) {
      item();
    });
}
имеется функция, если её выполнить, результатом будет пять пятерок. Я понимаю почему так происходит

Переделываем функцию
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function test2(){
    var cbs = [];
    for (var i = 0; i < 5; ++i){
        var j = i; //добавили 
        cbs.push(function() { console.log(j); });
    }
 
    cbs.forEach(function(item, i, arr) {
      item();
    });
}
Теперь результат пять четверок... Почему так? И как сделать чтобы в результате была последовательность от нуля до 4?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2020, 09:56
Ответы с готовыми решениями:

Опять таки не понятно почему не работает скрипт
Есть простая разметка &lt;div class=&quot;header-wrap&quot;&gt; &lt;ul class=&quot;navigation&quot;&gt; &lt;li&gt;Привет&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; .header-wrap{...

Формы, не понятно почему отправляется post-запрос
вот у меня есть код: &lt;head&gt; &lt;style type=&quot;text/css&quot;&gt; .style1 { font-size: xx-small; } ...

Не понятно почему предупреждение
Всем привет. Подскажите почему в коде a, b, c = 1, 2, -3 def Discriminant(a, b, c): D = b**2 - 4 * a * c return float(D)...

2
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
22.02.2020, 11:19
Здравствуйте.
Чтобы вывести числа от 0 до 4 есть два варианта:
JavaScript
1
2
3
4
function test3(){
var cbs = []; 
for (var i = 0; i < 5; i++) {cbs.push(function(value) {return function() {console.log(value);}}(i)); };
cbs.forEach(function(func) {func()})}
JavaScript
1
2
3
4
5
6
7
8
9
10
function test2(){
    var cbs = [];
    for (let i = 0; i < 5; ++i){
        cbs.push(function() { console.log(i); });
    }
 
    cbs.forEach(function(item, i, arr) {
      item();
    });
}
А четверки во втором случае потому, что когда i=5, условие в цикле уже не выполняется, и новая переменная j на очередном шаге не создаётся; а в первом коде она нам и нужна, мы выводим в консоль значения i.
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
22.02.2020, 13:31
Лучший ответ Сообщение было отмечено DrType как решение

Решение

Ganter, DrType, с замыканиями всё намного печальнее.

Сравните var и let:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        function test1() {
            var cbs = [];
            for (var i = 0; i < 5; ++i) {
                cbs.push(function () { console.log(i); });
            }
 
            cbs.forEach(function (item, i, arr) {
                item();
            });
        }
 
        function test2() {
            let cbs = [];
            for (let i = 0; i < 5; ++i) {
                cbs.push(function () { console.log(i); });
            }
 
            cbs.forEach(function (item, i, arr) {
                item();
            });
        }
 
        test1()
        test2();
Так что в теме Тесты по JavaScript и JS фреймворкам по лексическому окружению тоже неправильные ответы.

У var лексическое окружение - функция.
У let - блок. (Значение I будет замыкаться при каждой итерации разное)
И всё это безобразие в одном и том же ES6.

------
Вторая опасность:
Именно замыкание в цикле надо стараться делать как можно реже. Сама по себе задача из топика экстремальная и учит новичка плохому.

Здесь бесконечно создается новый экземпляр с переменными замыкания и новым экземпляром анонимной функции.
Если есть возможность вынести объявление функции из кишков, то лучше вынести на свежий воздух.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2020, 13:31
Помогаю со студенческими работами здесь

Код не работает почему то, не понятно(
Помогите пожалуйста)! не понимаю в чем ошибка вроде все должно работать программа должна открыть все файлы названия которых...

Итератор. Не понятно почему не компилируется
Задача на суммирование двух соседних элементов при помощи итератора. vector &lt;int&gt; n; int x; while (cin &gt;&gt; x) ...

Не понятно, почему не решается уравнение
может с символами действий что-то не так?

Inaccessible value Не понятно почему выскакивает
Пишу обход бинарных деревьев. При этом непонятно почему вылазит эта ошибка, помогите((( type u=^zap; {тип элемента дерева} ...

Не понятно почему не заполняется МАССИВ Dictionary
Вот когда я делаю так: Dictionary&lt;string, int&gt; dic; dic = new Dictionary&lt;string, int&gt;() dic.add(&quot;123&quot;, 123); ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru