JavaScript output is almost always async. For instance, you can make multiple updates to DOM, but user won't see any changes until control returns to event queue. implicitly, any change you make queues a 'redraw' event.
For example, in webkit based browsers, console.log is async:
(function(){
var obj = {};
console.log(obj);
obj.foo = "hello";
})();Above code will log {foo: 'hello'} in chrome and safari, but {} in node.
(This seems to have been corrected in chrome now.)
Both setTimeout and setInterval have a minimum delay of 4ms, according to the HTML spec.
"If the currently running task is a task that was created by the setTimeout() method, and timeout is less than 4, then increase timeout to 4."
Implication of JavaScript's event loop runtime is that each event that fires will be at the bottom of the stack. Hence, stack trace will not give much context about where the event was initiated.