Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Когда локальные возомнили себя глобальными (https://javascript.ru/forum/misc/12988-kogda-lokalnye-vozomnili-sebya-globalnymi.html)

kukuyok 11.11.2010 19:48

Когда локальные возомнили себя глобальными
 
Обработчиком document.body.onload назначена функция:
function initilitto()
	{
		for(var i=1; i<=N_men; i++)
		{
			var dMen = document.getElementById('pun'+i);
			
			dMen.onmouseover = function () {
				if(uhodT[i-1]!==undefined)
				{
					clearInterval(uhodT[i-1]);
				}
				uhodT[i-1]=setInterval(vyhozhka, 20);
				alert('Вылез '+i+'-й рулон');
			}
		
			dMen.onmouseout = function () {
				if(uhodT[i-1]!==undefined)
				{
					clearInterval(uhodT);
				}
				uhodT[i-1]=setInterval(uhozhka, 20);
			}
		}
	}


uhodT[] - массив с таймерами. Инициализированный со значениями undefined. Кстати, работоспособно ли?
uhodT=[
		undefined,
		undefined,
		undefined,
		undefined,
		undefined
	];


Если навести на любой из элементов с id=pun1...pun2 всплывает непременно "Вылез 6-й рулон", при этом N_men=5. Т.е. локальная иттерационная переменная цикла в конце инкрементируется, достигая значения 6, но, не пройдя условие продолжения цикла, не исчезает, а остаётся на плаву и используется назначенными на обработку событий функциями, как глобальная. Ну и всё, конечно, работает не как надо :) Как ея победить?

B@rmaley.e><e 11.11.2010 20:16

http://javascript.ru/basic/closure

kukuyok 13.11.2010 19:41

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 78681)

Спасибо. Муторно, но доступно :) Выходит:
function initilitto()
	{
		for(var i=0; i<N_men; i++)
		{
			var dMen = document.getElementById('pun'+(i+1));
			
			dMen.onmouseover = function(numar) {
				return function () {
					if(uhodT[numar]!==undefined)
					{
						clearInterval(uhodT[numar]);
					}
					uhodT[numar]=setInterval(vyhozhka, 20);
				}
			}(i);
			
			dMen.onmouseout = function(numar) {
				return function () {
					if(uhodT[numar]!==undefined)
					{
						clearInterval(uhodT[numar]);
					}
					uhodT[numar]=setInterval(uhozhka, 20);
				}
			}(i);
		}
	}


Правда, проявилась проблема иного характера... разумеется :)


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