Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.01.2012, 17:23   #1
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию Замыкания и setTimeout

Ситуация глупая, но разобраться в ней не могу уже второй день...

Давным давно Я написал плагин анимации в jQuery. Тогда я ещё мало чего знал в JS, делал по аналогии. Сейчас возникла ситуация, что плагин надо было переписать. Встретил в коде строку:
Код:
window.setTimeout(function() { xxx();}, 1);
с комментарием "Лечим замыкание. Обязательно потом исправь"

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

Вот и возник вопрос, как при помощи setTimeout можно вылечить замыкание?

Перефразирую: как избежать замыкания без setTimeout?

Последний раз редактировалось Виталий Желтяков; 25.01.2012 в 20:20.
Виталий Желтяков вне форума Ответить с цитированием
Старый 25.01.2012, 19:45   #2
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

предположу что время выполнения в 1 милисек недостаточно для выполния скрипта.
Lesha вне форума Ответить с цитированием
Старый 25.01.2012, 20:00   #3
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Тут ситуация в том, что setTimeout не позволяет возникнуть замыканию. При его использовании всё нормально. Но почему?
Виталий Желтяков вне форума Ответить с цитированием
Старый 25.01.2012, 20:12   #4
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Начну с того, что первый раз об этом слышу. Могу только строить предположения: за 1мс успевает выполниться основная функция, поэтому скоп уничтожается.
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 26.01.2012, 06:52   #5
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Могу только строить предположения: за 1мс успевает выполниться основная функция, поэтому скоп уничтожается.
Да, получается так, Я проверил.

Но тогда как этого избежать.
Виталий Желтяков вне форума Ответить с цитированием
Старый 26.01.2012, 07:22   #6
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

таймаут запускает функцию параллельно основной. Как поступить без таймаута что-то в голову не приходит=)
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 26.01.2012, 12:21   #7
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Но тогда как этого избежать.
Первое что приходит в голову - сделать скоп основной функции доступной для "сборщика мусора", изменив, например, порядок вложенности функций.
Цитата:
таймаут запускает функцию параллельно основной
мне казалось js однопоточный язык
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 26.01.2012, 13:16   #8
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Всё разобрался.

У меня было, что setTimeout откладывал выполнение функции до тех пор пока она не закончиться. В функции было зацикленное замыкание, которое к тому же создавало утечку. При вызове напрямую это зацикливание становилось явным.
В итоге пришлось разбираться с зацикливанием замыкания. А там у меня ещё один setTimeout с рекурсивной функцией....
Лучше бы с нуля по новой написал.

Цитата:
Первое что приходит в голову - сделать скоп основной функции доступной для "сборщика мусора", изменив, например, порядок вложенности функций.
Кстати, так Я и решил эту ситуацию.

Тему можно закрывать.
Виталий Желтяков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замыкания Viconte JavaScript, Ajax 1 07.11.2010 21:08
setTimeout bulldog5293 Работа с сетью в Delphi 1 22.07.2010 14:31
SetInterval и SetTimeOut Syltan JavaScript, Ajax 1 10.05.2010 22:42
setTimeout отказывается работать Deight JavaScript, Ajax 17 29.01.2009 20:29