Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   опять про setTimeout (https://javascript.ru/forum/misc/3397-opyat-pro-settimeout.html)

AzriMan 15.04.2009 17:55

опять про setTimeout
 
простенький скрипт.
'123' появляется ровно столько раз сколько выполняется условие [i]stat_type.options.selected==true
alert функции testInterval не вызывается. что может быть не так?

function testInterval(param)
{
	alert(param);
}


function form_getData ()
{
	var stat_type	= document.getElementsByName("stat_type")[0];
	for (i=0; i<stat_type.options.length; i++)
	{
		if (stat_type.options[i].selected==true)
		{
			var someresult = setTimeout(function(){
				alert(123);
				testInterval(stat_type.options[i].value);
				alert("after"); 
			}, 1000);
		}
	}
}

Kolyaj 15.04.2009 17:57

AzriMan,
а консоль ошибок еще не нашли?

http://javascript.ru/tutorial/basic/...ispol-zovaniia

AzriMan 15.04.2009 18:16

да. действительно.
Цитата:

Error: stat_type.options[i] is undefined
Source File: http://xxx.yy/paaath/to/file/export_engine.php
Line: 356
в консоль ошибок браузера редко смотрю. в основном было достаточно firebug-а.
сейчас кое-что попробую.

AzriMan 15.04.2009 18:23

конечное решение:
function testInterval(param)
{
	alert("simple text");
	alert(param);
}


function form_getData ()
{
	var stat_type	= document.getElementsByName("stat_type")[0];

	stat_type_len = stat_type.options.length;
	for (i=0; i<stat_type_len; i++)
	{
		if (stat_type.options[i].selected==true)
		{
			//alert(stat_type.options[i].value);
			var someresult = setTimeout(function(obj){
				return function() {
					alert(123);
					testInterval(obj);
					alert("after"); 
				}
			}(stat_type.options[i].value), 5000);
		}
	}
}


спасибо за помощь.

p.s.
Цитата:

Вы должны добавить отзыв кому-то ещё, прежде чем сможете снова добавить его Kolyaj.
вот блин :) кто окажется промежуточным звеном?

AzriMan 15.04.2009 18:45

кстати не понятно. возьмем такой пример.
<head>
<script type="text/javascript">
    function f()
    {
        var x = document.getElementById('div');
        setTimeout(function() { alert(x.innerHTML) }, 1000);
    }
</script>
</head>
<body onload="f()">
<div id='div'>123</div>
</body>


it w-o-r-k-s

чем он отличается от моего первого "не работающего"?

Kolyaj 15.04.2009 18:49

В первом переменная i изменяется и на момент выполнения функции, переданной в setTimeout, имеет совсем другое значение.

AzriMan 15.04.2009 18:55

а почему тогда браузер проругался что stat_type.options[i] is undefined а не выдал результат, соответствующий последнему значению переменно i?

ZoNT 15.04.2009 19:00

for (var i=0; i<5; i++) alert(i);
alert('i= '+i);


Посмотри что выдаст такой скрипт, может сам поймёшь...

AzriMan 15.04.2009 19:04

почему-то мне кажется, что там будет i=4. сейчас проверю.

а не. всё верно i=5. значение ведь сперва увеличивается а потом уже проверяется условие.

AzriMan 16.04.2009 09:36

Цитата:

Сообщение от ZoNT (Сообщение 16708)
for (var i=0; i<5; i++) alert(i);
alert('i= '+i);


Посмотри что выдаст такой скрипт, может сам поймёшь...

ты имеешь ввиду что i==stat_type.options.length и поэтому тот элемент был не найден?

если так, то как бы он тогда с этим условием вошел в замыкание? если оно выполняется при i == i<stat_type.options.length-1 (по крайней мере я думаю что это так)

twolf 16.04.2009 11:20

Цитата:

Сообщение от AzriMan (Сообщение 16709)
значение ведь сперва увеличивается а потом уже проверяется условие.

Это если бы было ++i
В данном примере наоборот: i увеличивается когда отработали все операторы.

Kolyaj 16.04.2009 11:43

AzriMan,
twolf,
оба сообщения -- бред, сотрите, пока мало кто видел :)

twolf 16.04.2009 11:48

полез в мануалы.
Цитата:

оператор перед переменной, переменная увеличивается прежде, чем возвращается её значение.
Цитата:

Это поведение воздействует на счётчик цикла for. Как правило счетчик цикла, который растёт вверх от минимального значения, увеличивается после того, как сработали все инструкции в цикле. Таким образом в большинстве счетчиков цикла оператор ++ размещается после переменной:

for (var i = 10; i >=0; i++) ...
может я неправильно что-то понял? :-?

Kolyaj 16.04.2009 11:56

for (var i = 0; i < 5; ++i)
    console.log(i);

for (var i = 0; i < 5; i++)
    console.log(i);

Чувствуете разницу? И я не чувствую.

Вы не про инкремент читайте, а про цикл for.

twolf 16.04.2009 12:07

тогда совершенно непонятно почему пишут, что инкремент именно после переменной, раз никакой разницы нет.

Kolyaj 16.04.2009 12:32

Как работает цикл for:
1. выполняется блок инициализации
2. выполняется блок условия, если ложно, то выходим из цикла
3. выполняется тело цикла
4. выполняется третий блок (хз как его назвать)
5. возвращаемся к п.2

Вот если цикл будет такого вида.
for (var i = 5; --i;)
    console.log(i)
for (var i = 5; i--;)
    console.log(i)
то будет разница.

twolf 16.04.2009 12:49

третий блок - это где изменяется счетчик?
тогда почему он выполняется после тела цикла?

Kolyaj 16.04.2009 12:50

Цитата:

Сообщение от twolf
тогда почему он выполняется после тела цикла?

По определению.

Zeroglif 16.04.2009 22:28

Цитата:

Сообщение от twolf
тогда почему он выполняется после тела цикла?

Поможет разобраться:

// 0 123 123 1 4

for ( ( alert(0), i = 0 ); ( alert(1), i < 2 ); ( alert(3), i++ ) ) {
    alert(2);
}

alert(4);


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