@maksim2099

На собеседовании на Front End вакансию задали такой вопрос..?

Что будет в консоли?
// 
var i = 10;
var array = [];

while (i--) {
    array.push(function() {
        return i + i;
    });
}

console.log([
    array[0](),
    array[1](),

])


А в консоли будет
0:-2
1:-2

Собственно вопрос почему?)
  • Вопрос задан
  • 534 просмотра
Решения вопроса 2
Значение i после цикла является -1. -1 -1 = -2.
Читайте про области видимости, замыкания.
Ответ написан
@abberati
frontend-разработчик
Это вариация классической задачи про армию функций. По ссылке есть задача, объяснение и ссылка на связанный урок.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
evgeniy8705
@evgeniy8705
Повелитель вселенной
var i = 10;
var array = [];

while (i--) {
  array.push(function() {
    return i + i;
  });
}

array.forEach(item => console.log(item())); // 10 раз напечатается -2

// после выхода из цикла i = -1; И так как i является "глобальной", то все функции будут "ссылаться" на одно и тоже значение после цикла
// array[function() { return i + i; }, function() { return i + i }, function() { return i + i }, ...]
// ==> array[function() { return -1 + -1 }, function() { return -2 }, ...]
// ==> array[0]() ==> return -2;

// ------------------------------------------------------
// Проблему можно решить так:

var i = 10;
var array = [];

while (i--) {
  array.push((function(i) {
    // Сохранить i в замыкании

    return function() {
    	return i + i;
    }
  })(i));
}

array.forEach(item => console.log(item())); // 18 16 14 12 10 8 6 4 2 0

// ------------------------------------------------------
// Или так

var i = 10;
var array = [];

while (i--) {
	let value = i;

  array.push(function() {
  	return value + value;
  });
}

array.forEach(item => console.log(item())); // 18 16 14 12 10 8 6 4 2 0
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы