2015-03-16 6 views
0

Я читал много статей об однопоточной модели исполнения JavaScript, циклах событий и очереди событий.Общие сведения о модели исполнения и цикла событий

Однако одно не ясно. Я создал скрипку, чтобы проиллюстрировать мой вопрос: http://jsfiddle.net/yzpmf67f/

<button onClick="window.compute()">Do computation</button> 
<button onClick="alert('doing')">Do something else</button> 

window.compute = function compute() { 
var result = 0; 
for (var i = 0; i < 100000; i++) { 
    for (var j = 0; j < 100000; j++) { 
     result = i + j; 
    } 
}; 
var textnode = document.createTextNode(result); 
document.body.appendChild(textnode); 

}

Если нажать на кнопку «Do вычисление» это займет некоторое время и заблокировать страницу. Но если вы нажмете кнопку «Сделать что-то еще», а страница все еще висит, она все равно будет добавлена ​​в очередь и будет выполнена после завершения нашего вычисления.

Итак, если JS является однопоточным, который помещает события пользовательского интерфейса в очередь событий, пока мы вычисляем что-то еще?

+1

Итак, где эта скрипка? :) –

+0

извините, столкнулся с stackoverflow из-за отсутствия исходного кода – damluar

ответ

2

Итак, если JS является однопоточным, который помещает события пользовательского интерфейса в очередь событий, пока мы вычисляем что-то еще?

Не очевидно JS :-) Это один из других потоков в браузере, который отвечает за управление событиями пользовательского интерфейса (которые, в свою очередь, предоставляются ОС) в этом случае. Фактически, есть много вещей, которые работают параллельно с движком JS, например поток (потоки), которые управляют сетевыми соединениями (и событиями ajax в очереди).

+0

, поэтому очередь событий может быть предоставлена ​​нашим кодом, используя, например, 'setTimeout()' или браузером (I/O, UI и т. Д.). Правильно ли это? – damluar

+1

Да, очередь событий всегда предоставляется из некоторых асинхронных фоновых операций. В случае 'setTimeout' он создаст объект фона таймера, который запускает событие через некоторое время. – Bergi

+1

@damluar Да. Это поведение отходит от сферы веб-страницы до уровня ОС и того, как доставляются сообщения. В случае вашего вопроса (по крайней мере, на окнах) он будет передавать (в том числе) «мыши» и «мыши» в браузер для обработки. Это когда эти события не обрабатываются своевременно приложением, которое вы получаете «не отвечающим» поведением. Эти события mousedown/mouseup в конечном итоге будут обработаны браузером и переведены на событие click на вашей кнопке. –