@andreyz40r

Как работает этот js код?

Помогите пожалуйста разобраться. Это решение задачи из книги "Выразительный javascript". Задача на односвязные списки: Напишите функцию arrayToList, которая строит такую структуру, получая в качестве аргумента [1, 2, 3]...

console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}


Почему работает код тела цикла? Разве на каждой итерации переменные не создаются заново?

function arrayToList(arr) {
	for (var i = arr.length - 1; i >= 0; --i) {
		var nextRest = list || null;
		var list = {};

		list["value"] = arr[i];
		list["rest"] = nextRest;
	}

	return list;
}
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
@MadridianFox
Web-программист, многостаночник
Переменные создаются заново, но их содержимое перекидывается туда-сюда и в итоге сохраняется и даже "увеличивается".
Представьте себе переливание воды из ведра в ведро. Вы берёте второе ведро, выливаете в него воду из первого ведра, а потом, добавив в пустое первое ведро кружку спирта, заливаете туда воду обратно из первого ведра.
При этом вы можете выкидывать пустое ведро после того как вылили из него воду и каждый раз покупать новое ведро чтобы налить в него воду.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
В JS есть существует "поднятие" переменных.
Иными словами ваш код равнозначен следующему:
function arrayToList(arr) {
  var i;                 // На самом деле именно здесь определяются все переменные
  var nextRest;          // данной функции объявленные
  var list;              //  через ключевое слово "var"

  for (i = arr.length - 1; i >= 0; --i) {
    nextRest = list || null;
    list = {};

    list["value"] = arr[i];
    list["rest"] = nextRest;
  }

  return list;
}


Если вы хотите чтобы данного поднятия не происходило, то определяйте переменные через ключевое слово let. Для let поднятие переменных не происходит.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Создаются, и соеденяются "цепочкой", так чтобы каждый элемент ссылался на соседний.
В этом и есть смысл односвязного списка.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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