Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 17.08.2012, 00:32
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

блин код не читаемые вообще....
вы бы сначала почитали про стиль написания (это не троллинг, говорю как есть)
Ответить с цитированием
  #22 (permalink)  
Старый 17.08.2012, 00:45
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Сообщение от vadim5june Посмотреть сообщение
Выполняем функция с параметром 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, создавая ее копию в его локальной области видимости на каждом шаге цикла. Благодаря этому всё теперь работает как задумывалось.
Ответить с цитированием
  #23 (permalink)  
Старый 17.08.2012, 00:50
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

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

а лучше использовать делегирование
Ответить с цитированием
  #24 (permalink)  
Старый 17.08.2012, 01:08
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Сообщение от vadim5june Посмотреть сообщение
он здесь 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); });
Ответить с цитированием
  #25 (permalink)  
Старый 17.08.2012, 01:27
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от platedz
В данном случае мы через call получаем
topmenu["filesload"](e,function(s){ alert(s); });
Ну да-и зачем это нужно?
Наверное есть какой то смысл и он может и связан с этим event который не везде работает
Вы код откуда взяли?
Ответить с цитированием
  #26 (permalink)  
Старый 17.08.2012, 01:33
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Сообщение от cyber Посмотреть сообщение
или так=)
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);
}

С делегированием я к сожалению еще не знаком, если только в джиквери, но думаю, что это не совсем то, или скорее совсем не то.
Ответить с цитированием
  #27 (permalink)  
Старый 17.08.2012, 01:36
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Сообщение от vadim5june Посмотреть сообщение
Ну да-и зачем это нужно?
Наверное есть какой то смысл и он может и связан с этим event который не везде работает
Вы код откуда взяли?
Код я из головы взял. Просто я пытаюсь реализовать предыдущие замыкания через call. Смысл получить знание.
Ответить с цитированием
  #28 (permalink)  
Старый 17.08.2012, 01:38
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

там получается замыкание , при каждой итерации цикла вызывается функция,а в замыкание значения переменных (как бы правильно сказать) не обнуляются
Ответить с цитированием
  #29 (permalink)  
Старый 17.08.2012, 04:47
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо всем ответившим. В принципе остался только вопрос с event. Надеюсь, и на него найдется ответ.
Ответить с цитированием
  #30 (permalink)  
Старый 17.08.2012, 08:49
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от platedz
В принципе остался только вопрос с event
а почему Вы event не передаете?
topmenu.replace.call(topmenu,"filesload",e,function(u,f){...
...
replace: function(s,evn,e)
                    {
this[s](evn,e);
 }
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из тектового файла Jackky Общие вопросы Javascript 14 30.06.2012 01:00
Чтение и запись файла kilogram Серверные языки и технологии 0 16.05.2012 23:59
Чтение и запись с txt или csv файла vitaver AJAX и COMET 0 23.12.2010 20:43
Чтение файла средствами javascript DVVID Общие вопросы Javascript 4 05.04.2010 15:00
чтение из случайного файла lesik Общие вопросы Javascript 7 07.07.2008 17:24