Показать сообщение отдельно
  #37 (permalink)  
Старый 04.09.2012, 17:30
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

document.write нельзя использовать в функциях исполняемых не сразу, а по событию или таймеру.

document.write - это особый способ вывода, который выводит код по мере загрузки страницы напрямую в тело(т.е. ещё не живой DOM, а просто в обрабатываемый на ходу код), и после того как страница сформирована и документ закрыт его использовать нельзя.

Т.е. document.write можно использовать даже так:
<script>
document.write('<in');
document.write('pu');
document.write('t');
document.write(' valu');
document.write('e="t');
document.write('ext');
document.write('">');
</script>
в отличие от innerHTML который работает уже на живую, а потому каждая выводимая часть обрабатывается сразу как полноценная:
<script>
function appendHTML( html, node ){
	var d = document,
		fragment = d.createDocumentFragment(),
		container = d.createElement('div');
	container.innerHTML = html;
	while( container.hasChildNodes() ) fragment.appendChild( container.firstChild );
	(node || d.body || d.documentElement).appendChild( fragment );
	return node
}
appendHTML('<in');
appendHTML('pu');
appendHTML('t');
appendHTML(' valu');
appendHTML('e="t');
appendHTML('ext');
appendHTML('">');
</script>


Сообщение от Kivi Посмотреть сообщение
Или какое k<XXXXXXX нужно поставить чтоб заработало?
Я так понимаю в хотите подобрать такое k, чтобы на момент прошествия 1000мс цикл всё ещё продолжал исполнение и соответственно значение k было взято из текущей итерации?
Так вот - это не возможно, т.к. асинхронность в js виртуальна и всё исполняется в одном потоке. Вызов же функции по событию или по таймеру, в случае если другой код ещё выполняется, ставит эту функцию в очередь выполнения сразу после окончания текущего непрерывного блока кода. Циклы же относятся как раз тем блокам, что нельзя прерывать.
Соответственно сколько бы не итерировался цикл, функция по таймеру не будет вызвана пока оный не закончится. По этому в описании setTimeout всегда пишут не: "вызывает функцию через n", а "вызывает функцию не раньше чем через n", или типа того.

Сообщение от Kivi Посмотреть сообщение
ведь (из моего примера) он в теле цикла в {}.
Нет не в теле. В описание setTimeout написано.(покрайней мере должно быть), что он исполняете передаваемую функцию в глобальной области видимости. А внутреннюю переменную i она видит только потому, что сама передаваемая функция была создана в внутри другой и замкнула на себя ссылки на внутренние переменные. И на момент исполнения i уже давно равна 10.

Также возможно вас смущает сам синтаксис for? Чтоб было понятнее:
function top(){
    for(var i = 0; i < 10; i++) {
        //...
    }
}
это то же самое что:
function top(){
    var i = 0;
    while(i < 10) {
        i++;
        //...
    }
}
Т.е. i в цикле не имеет никаких особых свойств, это такая же обычная переменная.
__________________
29375, 35

Последний раз редактировалось Aetae, 04.09.2012 в 18:18.
Ответить с цитированием