2015-03-09 4 views
6

Простите меня, если это может быть немного вопросом noobie, но это должно работать, не так ли?Сохраняющее состояние в замкнутом контуре с закрытием

var elems = [1,2,3,4,5] 

for (var i = 0; i <elems.length; i++) { 
    return (function(e){ 
     console.log(e) 
    })(i); 
} 

Значение, он должен выплюнуть

>>node file.js 
1 
2 
3 
4 
5 

По какой-то причине это не делает этого. Скорее, когда он работает в терминале, он выплевывает

>>node file.js 
1 

Что мне не хватает? Не могли бы вы рассказать.

+1

«Возврат» вне функции? Интересно, как это не синтаксическая ошибка. – Bergi

+1

Связанный вопрос - [Почему оператор возврата уровня модуля работает в Node.js?] (Http://stackoverflow.com/q/28955047/1903116) – thefourtheye

ответ

7

Поскольку вы возвращаете значение, возвращаемое IIFE немедленно, в этом заявлении

return (function(e){ 
    console.log(e) 
})(i); 

поскольку IIFE просто печатает 0 и не возвращает ничего явного, JavaScript будет возвращать undefined по умолчанию и выйти немедленно. Чтобы исправить это, просто перенесите return ключевое слово,

(function(e){ 
    console.log(e) 
})(i); 

PS: Вы когда-нибудь задавались вопросом, почему return заявление в приведенном выше коде работает? Чтобы думать об этом, он не находится внутри функции. Тогда технически это ошибка, не так ли? ;-) Я объяснил это подробно, в этом question.

2

Когда вы вызываете возврат, он немедленно выйдет из цикла. Если вы хотите вернуть все значения, вам нужно будет поместить их в контейнер и вернуть контейнер.

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