<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: sazid khan</title>
    <description>The latest articles on DEV Community by sazid khan (@sazid_khan_42435bbe1c9a9c).</description>
    <link>https://dev.to/sazid_khan_42435bbe1c9a9c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4135267%2Fa0b986e8-21b2-478c-ab27-505c827cb7a0.jpg</url>
      <title>DEV Community: sazid khan</title>
      <link>https://dev.to/sazid_khan_42435bbe1c9a9c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sazid_khan_42435bbe1c9a9c"/>
    <language>en</language>
    <item>
      <title>I Built a Visual JavaScript Execution Tool Because Reading the Event Loop Wasn’t Enough</title>
      <dc:creator>sazid khan</dc:creator>
      <pubDate>Mon, 21 Sep 2026 08:17:16 +0000</pubDate>
      <link>https://dev.to/sazid_khan_42435bbe1c9a9c/i-built-a-visual-javascript-execution-tool-because-reading-the-event-loop-wasnt-enough-1l51</link>
      <guid>https://dev.to/sazid_khan_42435bbe1c9a9c/i-built-a-visual-javascript-execution-tool-because-reading-the-event-loop-wasnt-enough-1l51</guid>
      <description>&lt;p&gt;One of the hardest parts of learning JavaScript isn’t writing the syntax.&lt;/p&gt;

&lt;p&gt;It’s understanding what JavaScript is actually doing behind the scenes.&lt;/p&gt;

&lt;p&gt;Take this simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Timeout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Promise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is:&lt;/p&gt;

&lt;p&gt;Start&lt;br&gt;
End&lt;br&gt;
Promise&lt;br&gt;
Timeout&lt;/p&gt;

&lt;p&gt;But knowing the output and understanding why it happens are two different things.&lt;/p&gt;

&lt;p&gt;The Problem&lt;/p&gt;

&lt;p&gt;When learning concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call Stack&lt;/li&gt;
&lt;li&gt;Event Loop&lt;/li&gt;
&lt;li&gt;Microtask Queue&lt;/li&gt;
&lt;li&gt;Task Queue&lt;/li&gt;
&lt;li&gt;Promises&lt;/li&gt;
&lt;li&gt;Closures&lt;/li&gt;
&lt;li&gt;Scope&lt;/li&gt;
&lt;li&gt;Hoisting&lt;/li&gt;
&lt;li&gt;Async/Await&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;we usually rely on static diagrams.&lt;/p&gt;

&lt;p&gt;Those diagrams are useful, but I wanted something more interactive.&lt;/p&gt;

&lt;p&gt;I wanted to actually see the code execute.&lt;/p&gt;

&lt;p&gt;So I built VisualJS.&lt;/p&gt;

&lt;p&gt;What is VisualJS?&lt;/p&gt;

&lt;p&gt;VisualJS is an interactive JavaScript visualization tool that helps you understand what happens while your JavaScript executes.&lt;/p&gt;

&lt;p&gt;Instead of only reading:&lt;/p&gt;

&lt;p&gt;“Promises use the microtask queue.”&lt;/p&gt;

&lt;p&gt;you can actually visualize the execution flow.&lt;/p&gt;

&lt;p&gt;Try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://visualjs.in/" rel="noopener noreferrer"&gt;https://visualjs.in/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s Look at the Example&lt;/p&gt;

&lt;p&gt;Consider this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Timeout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Promise&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The synchronous code executes first:&lt;/p&gt;

&lt;p&gt;Start&lt;br&gt;
End&lt;/p&gt;

&lt;p&gt;The Promise callback goes into the microtask queue.&lt;/p&gt;

&lt;p&gt;The setTimeout callback goes into the task queue.&lt;/p&gt;

&lt;p&gt;After the current synchronous execution finishes, microtasks are processed before the next task.&lt;/p&gt;

&lt;p&gt;So we get:&lt;/p&gt;

&lt;p&gt;Start&lt;br&gt;
End&lt;br&gt;
Promise&lt;br&gt;
Timeout&lt;/p&gt;

&lt;p&gt;Seeing this execution step by step makes the behavior much easier to understand.&lt;/p&gt;

&lt;p&gt;What I’m Building&lt;/p&gt;

&lt;p&gt;The goal of VisualJS isn’t just to visualize the Event Loop.&lt;/p&gt;

&lt;p&gt;I want to make difficult JavaScript concepts interactive.&lt;/p&gt;

&lt;p&gt;Some of the concepts I’m working on include:&lt;/p&gt;

&lt;p&gt;JavaScript Execution&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Call Stack&lt;/li&gt;
&lt;li&gt;Execution Context&lt;/li&gt;
&lt;li&gt;Scope&lt;/li&gt;
&lt;li&gt;Hoisting&lt;/li&gt;
&lt;li&gt;Closures&lt;/li&gt;
&lt;li&gt;this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asynchronous JavaScript&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event Loop&lt;/li&gt;
&lt;li&gt;Microtasks&lt;/li&gt;
&lt;li&gt;Macrotasks&lt;/li&gt;
&lt;li&gt;Promises&lt;/li&gt;
&lt;li&gt;Async/Await&lt;/li&gt;
&lt;li&gt;Timers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript Internals&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototype Chain&lt;/li&gt;
&lt;li&gt;Objects&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Memory and References&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;Don’t just read what JavaScript does. See it happen.&lt;/p&gt;

&lt;p&gt;Try This Yourself&lt;/p&gt;

&lt;p&gt;Before running this code, predict the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;D&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What do you think it will print?&lt;/p&gt;

&lt;p&gt;A&lt;br&gt;
?&lt;br&gt;
?&lt;br&gt;
?&lt;/p&gt;

&lt;p&gt;Now try it in VisualJS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://visualjs.in/" rel="noopener noreferrer"&gt;https://visualjs.in/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d Love Your Feedback&lt;/p&gt;

&lt;p&gt;VisualJS is still evolving, and I’d love feedback from JavaScript developers.&lt;/p&gt;

&lt;p&gt;Which JavaScript concept is hardest for you to understand?&lt;/p&gt;

&lt;p&gt;What would you like to visualize?&lt;/p&gt;

&lt;p&gt;What would make the tool more useful?&lt;/p&gt;

&lt;p&gt;If you try VisualJS, let me know what you think.&lt;/p&gt;

&lt;p&gt;VisualJS: &lt;a href="https://visualjs.in/" rel="noopener noreferrer"&gt;https://visualjs.in/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s make JavaScript internals a little less mysterious. 🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
