Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Инкапсуляция, чтение файла и event в firefox (https://javascript.ru/forum/events/30819-inkapsulyaciya-chtenie-fajjla-i-event-v-firefox.html)

cyber 17.08.2012 00:32

блин код не читаемые вообще....
вы бы сначала почитали про стиль написания (это не троллинг, говорю как есть)

platedz 17.08.2012 00:45

Цитата:

Сообщение от vadim5june (Сообщение 198169)
Выполняем функция с параметром v
основной смысл что мы не создаем на глобальном уровне имени функции
(не засоряем)
с именем так бы выглядело
function f(s){alert(s)};
f(5);

Спасибо большое. Теперь понятно вроде, хотя практические применения не очень ясны. Например вот это.

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, создавая ее копию в его локальной области видимости на каждом шаге цикла. Благодаря этому всё теперь работает как задумывалось.

cyber 17.08.2012 00:50

или так=)
for (var i = 0; i < links.length; i++) (function(i) {
links[i].onclick = function() {
alert(i);
}
})(i);

а лучше использовать делегирование

platedz 17.08.2012 01:08

Цитата:

Сообщение от vadim5june (Сообщение 198172)
он здесь this[s](event,e);
не определен-но я так и не понял его смысла-ведь он делает тоже что и
filesload только более сложным образом?
Или еще что то?

topmenu.filesload(e,function(s){alert(s);});

topmenu.replace.call(topmenu,"filesload",function( u,f) { alert(u+" = "+f.name);})

Эти два кода по сути аналогичный, но последний реализован через call

В данном случае мы через call получаем
topmenu["filesload"](e,function(s){ alert(s); });

vadim5june 17.08.2012 01:27

Цитата:

Сообщение от platedz
В данном случае мы через call получаем
topmenu["filesload"](e,function(s){ alert(s); });

Ну да-и зачем это нужно?
Наверное есть какой то смысл и он может и связан с этим event который не везде работает
Вы код откуда взяли?

platedz 17.08.2012 01:33

Цитата:

Сообщение от cyber (Сообщение 198178)
или так=)
for (var i = 0; i < links.length; i++) (function(i) {
links[i].onclick = function() {
alert(i);
}
})(i);

а лучше использовать делегирование

Спасибо за способ. Возьму на заметку.
Насколько я понимаю в указанном мною примере в цикле идет перебор всех ссылок, и назначается каждому событие клик которое выполняет функцию алерт со значением 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);
}

С делегированием я к сожалению еще не знаком, если только в джиквери, но думаю, что это не совсем то, или скорее совсем не то.

platedz 17.08.2012 01:36

Цитата:

Сообщение от vadim5june (Сообщение 198186)
Ну да-и зачем это нужно?
Наверное есть какой то смысл и он может и связан с этим event который не везде работает
Вы код откуда взяли?

Код я из головы взял. Просто я пытаюсь реализовать предыдущие замыкания через call. Смысл получить знание.

cyber 17.08.2012 01:38

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

platedz 17.08.2012 04:47

Спасибо всем ответившим. В принципе остался только вопрос с event. Надеюсь, и на него найдется ответ.

vadim5june 17.08.2012 08:49

Цитата:

Сообщение от platedz
В принципе остался только вопрос с event

а почему Вы event не передаете?
topmenu.replace.call(topmenu,"filesload",e,function(u,f){...
...
replace: function(s,evn,e)
                    {
this[s](evn,e);
 }


Часовой пояс GMT +3, время: 09:26.