Функция триггера кажется синхронной. То есть все связанные функции, как представляется, выполняются последовательно, синхронно (вызываемая функция может делать что-то асинхронно, но это не вопрос).
Это верно для пользовательских и нестандартных (щелчок, зависание и т.д.) событий? Существуют ли какие-либо события, когда однопоточная гарантия javascript не выполняется?
Если это правда, можно ли изменить поведение, чтобы выполнить их асинхронно, не вставляя таймауты в каждую связанную функцию?
Вот пример, который демонстрирует вопрос:
var ele = $('#blah');
// Example of the bound function doing something synchronously
ele.bind('customEvent.sync', function() {
// Do something synchronously
window.foo = 'foo';
});
// Example of the bound function doing something asynchronously
ele.bind('customEvent.async', function() {
window.setTimeout(function() {
// Do something asynchronously
window.bar = 'bar';
}, 0);
});
// Trigger both events
ele.trigger('customEvent');
// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted
alert(window.foo + ':' + window.bar);
UPDATE Смотрите: Является ли JavaScript гарантированным однопоточным? Пользовательские события гарантированно синхронны из-за однопоточного характера javascript. Некоторые встроенные типы событий могут быть несинхронными из-за несоответствий браузера.