@webvlassov

Как написать функцию, которая будет выводить массив функций, которые выводят порядковый номер массива?

Сама задача звучит так: Программист планировал создать массив из 100 функций, каждая из которых выводит свой порядковый номер в этом массиве. При проверке выводится не то, что нужно. Исправьте ошибку программиста.
function FunctionArray(count)
{
    var arr = [];
    for (var i = 0; i < count; i++) {
        arr[i] = function() { alert(i) };
    }
    return arr;
}

var i=100;
var arr = FunctionArray(i);

//Проверка
arr[0]();


Перепробовал разные способы, но все равно при вызове любой ф-ии из массива выводится - 100.
Прошу помочь разобраться с этим вопросом, спасибо!
  • Вопрос задан
  • 6707 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Все ваши функции ссылаются на одно и то же значение - i. Что бы все работало в момент определения функции надо сохранять это значение.

function generateArr(count) {
    var arr = [];
    for (var i = 0; i < count; i++) {
        arr[i] = makeFunction(i);
    }
    return arr;
}

function makeFunction (i) {
    return function () {
        alert(i);
    }
}


приведенный мой код будет работать, так как при передаче переменной в качестве аргумента функции происходит копирования значения (ну... не совсем, там copy-on-write всякие применяются но все же суть та же).

Что бы чуть лучше читалось...

function generateArr() {
    var arr;
    for(var arr = []; arr.length < 100;arr.push(null));

    return arr.map(function (_, i) {
        return function () {
           alert(i);
        }
    })
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@webvlassov Автор вопроса
Спасибо большое, вроде понял суть решения задачи.
Как я понимаю, можно еще и так переписать данную ф-ию:
function FunctionArray(count) {
    var arr = [], i;
    for (i = 0; i < count; i++) {
         (function(index){
              arr.push(function(){ alert(index) });
         }(i));
    }
    return arr;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы