В 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 поднятие переменных не происходит.