2015-10-17 3 views
-1

(Не нашли эту Q при поиске, но может быть вопросом, не зная условий, для которых поиск)Несколько операторов в Javascript анонимной функции

Попытка имитировать диапазон(), используя код, который я нашел на SO (изучение языка, что позволяет избежать использования готовых функций в underscore.js), и у меня возникают проблемы понимания, почему это будет работать:

var range = Array.apply(null,Array(3)); 

range = range.map(function (x, i) {return i;}); 

Но это не делает:

var range = Array.apply(null,Array(3)); 

range = range.map(function (x, i) { 
    console.log(range[i-1]); 
    return i; 
}); 

< undefined 
< undefined 
< undefined 

Якобы только разница - это линия console.log, но почему это должно иметь значение?

Заранее благодарен!

+2

Они оба возвращают * ту же самую точную вещь '[0, 1, 2]' - единственное отличие, которое я вижу на выходе, - это 3 'undefined', напечатанные 'console.log()' (что следует ожидать, так как 'x' является фактическим элементом массива, а не индексом). – techfoobar

+0

спасибо! «x» был немой опечаткой, но «неопределенные» сообщения все еще откачивались, когда исправлялись. Я отредактирую код, но @ShadowRanger объяснил это ниже. – Brandon

ответ

0

В первой строке создается массив размером 3, но все значения будут не определены. Когда вы повторяете его с map (чтобы сделать новый range), вы регистрируетесь путем индексирования; range[x - i] в первом цикле смотрит range[undefined - 0] (становится range[0]), а последующие петли смотрят на range[-1] и т. Д. Конечно, они undefined. Пока map не завершен, range не был переназначен, так что вы получите только undefined. Когда map завершает работу с log, range будет [0, 1, 2].

+0

спасибо - я работал в предположении, что каждый элемент массива был переназначен после того, как карта() повторила его. Хорошо знать, как это работает. – Brandon

Смежные вопросы