JAVASCRIPT

VANILLA  #5

Event Loop

code execution cycle

Call Stack

push function calls
pop on return
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
init();
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
init();
new Model(1);
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
init();
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
init();
new Model(2);
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
init();
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

main(); // global
function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  this.nr = nr;
}

init();

Call Stack

...

Recursion

function init() {
  init();
}

init();

Call Stack

main(); // global
function init() {
  init();
}

init();

Call Stack

main(); // global
init();
function init() {
  init();
}

init();

Call Stack

main(); // global
init();
init();
function init() {
  init();
}

init();

Call Stack

main(); // global
init();
init();
init();
function init() {
  init();
}

init();

Call Stack

main(); // global
init();
init();
init();
.
.
.
.
.
init();
stack overflow
IE 9/10 ~ 20.000
Chrome  ~ 25.000

Exceptions

function init() {
  var o1 = new Model(1);
  var o2 = new Model(2);
}

function Model(nr) {
  if ( nr > 1 ) {
    throw new Error();
  }
  this.nr = nr;
}

init();

Call Stack

main(); // global
init();
new Model(2);
Uncaught Error();

Async calls

function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

main(); // global
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

main(); // global
init();
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

main(); // global
init();
setTimeout();
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

main(); // global
init();
log("init");
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

main(); // global
init();
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

main(); // global
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

cb();
function init() {
  setTimeout(cb, 1000);
  log("init");
}

function cb() {
  log("callback");
}

init();

Call Stack

cb();
log("callback");

ES specs

about setTimeout:
""

BOM

window.setTimeout();

Call Stack

APIs

BOM
DOM
XHR
setTimeout();
onclick();
$.get();

Message Queue

cbTimeout();
cbGet();

0 > 0

UI block

while the stack executes

Run to Completion

each function executes its entire body
before it returns

Thank You

JavaScript Vanilla #5 - Event Loop

By Andrei Pfeiffer

JavaScript Vanilla #5 - Event Loop

Understanding how code is executed in JavaScript si crucial when you want to optimize your scripts and applications. I talk about the call stack, WebApis that handle async code, message queue, why is the UI blocked by code and what's really happening when you use setTimeout(0).

  • 1,024