
Мы сорвали этот цветок с куста, чтобы сделать это фото. Улитка была большая, тропическая, цветок - цветок штата... Потом оказалось, что цветок изрядно поеден. Приятного аппетита!
for(var i=0; i<a.length; i++){ var e=a[i]; do_something_with(e); } for(var i in a){ var e=a[i]; do_something_with(e); }Хотя второй выглядит короче, первый считается быстрее. Если мы возьмем ассоциативный массив, то первый метод неприменим, а второй продолжает работать.
function array_wrap(a){ return { a: a, fill: function(n, f){ for(var i=0; i<n; i++) this.a.push(f(i)); return this; }, foreach: function(f){ for(var i=0; i<this.a.length; i++){ var e=this.a[i]; f(i,e); } return this; } } }
array_wrap([]) .fill(10, function(i){ return function(){ document.write(i); } } ) .foreach( function(i, e){ e(); } );Результат: "0123456789".
array_wrap([]) .fill(10, (i)=>( () => { document.write(i); } )) .foreach( (i,e) => { e(); } );
var found={}; database.iterate_records( function(record){ found[record.phone]=record.name; } );
var a=[]; for(var i=0; i<10; i++) a.push(function(){ document.write(i); }); for(var i=0; i<10; i++) a[i]();Запускаем, получаем: "0123456789". Что и требовалось, так? Ship it!
var a=[]; for(var i=0; i<10; i++) a.push(function(){ document.write(i); }); for(var j=0; j<10; j++) a[j]();Что ожидаем? То же самое. Что получаем? "10101010101010101010". Как это?
var a=[]; for(var i=0; i<10; i++) a.push(function(){ document.write(i+' '); }); for(var j=0; j<10; j++) a[j]();Получаем: "10 10 10 10 10 10 10 10 10 10 ". Не помогает.
var a=[]; for(var i=0; i<10; i++){ var ii=i; a.push(function(){ document.write(ii); }); } for(var j=0; j<10; j++) a[j]();Получаем "9999999999". Как это?
var a=[]; for(var i=0; i<10; i++) a.push( function(i){ return function(){ document.write(i); }} (i) ); for(var j=0; j<10; j++) a[j]();Получаем "0123456789". Ура! Заработало. Теперь не забыть писать такое везде, где есть замыкание. Здорово, правда?
var a=[]; for(var i=0; i<10; i++) a.push( function(a){ return function(){ document.write(a); }} (i) ); for(var j=0; j<10; j++) a[j]();Здесь мы определяем функцию и тут же ее вызываем: function(a){...}(i)