блин код не читаемые вообще....
вы бы сначала почитали про стиль написания (это не троллинг, говорю как есть) |
Цитата:
http://habrahabr.ru/post/38642/ в частности Напоследок хочу описать распространённую ошибку, которая многих вгоняет в ступор в случае незнания того, как работают замыкания. Пускай у нас есть массив ссылок, и наша задача — сделать так, чтобы при клике на каждую выводился алертом ее порядковый номер. Первое решение, что приходит в голову, выглядит так: for (var i = 0; i < links.length; i++) { links[i].onclick = function() { alert(i); } } На деле же оказывается, что при клике на любую ссылку выводится одно и то же число — значение links.length. Почему так происходит? В связи с замыканием объявленная вспомогательная переменная i продолжает существовать, при чём и в тот момент, когда мы кликаем по ссылке. Поскольку к тому времени цикл уже прошёл, i остаётся равным кол-ву ссылок — это значение мы и видим при кликах. Решается эта проблема следующим образом: for (var i = 0; i < links.length; i++) { (function(i) { links[i].onclick = function() { alert(i); } })(i); } Здесь с помощью еще одного замыкания мы «затеняем» переменную i, создавая ее копию в его локальной области видимости на каждом шаге цикла. Благодаря этому всё теперь работает как задумывалось. |
или так=)
for (var i = 0; i < links.length; i++) (function(i) { links[i].onclick = function() { alert(i); } })(i); а лучше использовать делегирование |
Цитата:
topmenu.replace.call(topmenu,"filesload",function( u,f) { alert(u+" = "+f.name);}) Эти два кода по сути аналогичный, но последний реализован через call В данном случае мы через call получаем topmenu["filesload"](e,function(s){ alert(s); }); |
Цитата:
Наверное есть какой то смысл и он может и связан с этим event который не везде работает Вы код откуда взяли? |
Цитата:
Насколько я понимаю в указанном мною примере в цикле идет перебор всех ссылок, и назначается каждому событие клик которое выполняет функцию алерт со значением i. Без инкапсуляции значение i после исполнения кода остается глобальным и при вызове функции в алерте вызывается глобальная переменная i. С инкапсуляцией видимо ей передается не сама переменная, а ее значение, уже после исполнения кода. Я правильно понимаю? Или я чего-то не понимаю? При этом на вновь созданную ссылку данный код уже не действует, и остается вопрос, как его получить? for (var i = 0; i < document.links.length; i++) { (function(i) { document.links[i].onclick = function() { alert(i); var newElem = document.createElement("a"); newElem.href = "#"; newElem.innerHTML = "Новая ссылка"; document.body.insertBefore(newElem, document.body.firstChild); return false; } })(i); } С делегированием я к сожалению еще не знаком, если только в джиквери, но думаю, что это не совсем то, или скорее совсем не то. |
Цитата:
|
там получается замыкание , при каждой итерации цикла вызывается функция,а в замыкание значения переменных (как бы правильно сказать) не обнуляются
|
Спасибо всем ответившим. В принципе остался только вопрос с event. Надеюсь, и на него найдется ответ.
|
Цитата:
topmenu.replace.call(topmenu,"filesload",e,function(u,f){... ... replace: function(s,evn,e) { this[s](evn,e); } |
Часовой пояс GMT +3, время: 09:26. |