@VladMokrousov

Почему функция работает именно так?

Привет, недавно изучаю js и при работе над проектом столкнулся со странностью. Когда задаю переменные глобально, при вызове функции происходит... Перемножение i между циклами? Не знаю, как еще это объяснить. Думал, что дело в области видимости или передаче массива commentsList по ссылке, но не нашел информации, объясняющей это поведение. Вот код, при котором можно наблюдать эффект - вместо трех комментариев в каждый объект записывается 15.
var comment,
commentsList = [];
var getCommentsList = function() {
    
    for (let i = 0; i < 3; i++) {
        comment = "Привет, мир!";
        commentsList.push(comment);
    }
    return commentsList;
};

var testArr = [];
for (let i = 0; i < 5; i++) {
    testArr.push({
        name: "Название объекта",
        sometext: getCommentsList()
    });
}
console.log(testArr);


А вот код, при котором все работает нормально:
var getCommentsList = function() {
    var comment,
    commentsList = [];
    for (let i = 0; i < 3; i++) {
        comment = "Привет, мир!";
        commentsList.push(comment);
    }
    return commentsList;
};

var testArr = [];
for (let i = 0; i < 5; i++) {
    testArr.push({
        name: "Название объекта",
        sometext: getCommentsList()
    });
}
console.log(testArr);
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Так вы из функции возвращаете ссылку на глобальный массив, в который при каждом вызове функции дописывается три элемента. В результате все sometext ссылаются на один и тот же массив, в котором к концу цикла получается ровно 5*3 = 15 элементов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fzero0
@Fzero0
Вечный студент
var comment,
commentsList = [];
var getCommentsList = function() {
    
    for (let i = 0; i < 3; i++) {
        comment = "Привет, мир!";
        commentsList.push(comment);
    }
    return commentsList;
};

var testArr = [];
for (let i = 0; i < 5; i++) {
    testArr.push({
        name: "Название объекта",
        sometext: commentsList
    });
}
getCommentsList()
console.log(testArr);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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