2

I run this code in JavaScript:

setTimeout(function(){console.log("1");}, 0);
console.log("2");

But output is:

2
1

Why not vice versa?

Praveen Kumar Purushothaman
  • 164,888
  • 24
  • 203
  • 252
Placinta Alexandru
  • 463
  • 2
  • 7
  • 20
  • 3
    Because set timeout adds the callback to the event queue... so the function will be called only after current execution thread is over – Arun P Johny Jan 20 '16 at 10:16
  • If it didn't work like that (and your running function could be interrupted in between lines), you'd run into all kinds of race conditions with asynchronous code. – Thilo Jan 20 '16 at 10:18

3 Answers3

4

The setTimeout() puts all the code in a queue, and then later based on the time, it executes. So you can see the list of procedures to execute as a line of queue. For the above code, you have:

  1. setTimeout
  2. console.log(2)
  3. Callback Functions, if any.
    1. console.log(1)

So, first thing that executes is, initialize the timer. Secondly, the console.log gets executed and you see 2. An interesting thing to note here is, setTimeout waits at least for 4 ms before executing its callback function.

Praveen Kumar Purushothaman
  • 164,888
  • 24
  • 203
  • 252
1

When you use setTimeout() or one of its friends, its function is placed on a queue to be executed after all the current code has finished.

It should be noted that the spec says the minimum time is clamped to 4.

alex
  • 479,566
  • 201
  • 878
  • 984
1

Simply because the callback function of the setTimeout method is executed later.

  1. setTimeout(..)

    Althought you specify 0 the callback function is not immediately executed. See https://stackoverflow.com/a/779785/2391070

  2. console.log("2") // 2

  3. setTimeout calls callback and console.log("1") // 1

Community
  • 1
  • 1
Daniel Bauer
  • 168
  • 2
  • 12