<?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: DHANRAJ S</title>
    <description>The latest articles on DEV Community by DHANRAJ S (@dhanraj_s_8fe1023a6e88992).</description>
    <link>https://dev.to/dhanraj_s_8fe1023a6e88992</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3728604%2Fda8159ef-5147-45a8-8789-69274d4b9d9b.png</url>
      <title>DEV Community: DHANRAJ S</title>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dhanraj_s_8fe1023a6e88992"/>
    <language>en</language>
    <item>
      <title>React Explained — What It Is, Why You Need It, and How to Set It Up the Right Way</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Thu, 16 Apr 2026 16:06:08 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/react-explained-what-it-is-why-you-need-it-and-how-to-set-it-up-the-right-way-46aj</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/react-explained-what-it-is-why-you-need-it-and-how-to-set-it-up-the-right-way-46aj</guid>
      <description>&lt;p&gt;Hey!&lt;/p&gt;

&lt;p&gt;Before we start — have you ever built something with JavaScript and thought:&lt;/p&gt;

&lt;p&gt;"Why is this getting so complicated so fast?"&lt;/p&gt;

&lt;p&gt;You're not alone. Every developer hits that wall.&lt;/p&gt;

&lt;p&gt;That's exactly why React exists. And by the end of this blog, you'll know what React is, why it matters, and how to get started with it the right way.&lt;/p&gt;

&lt;p&gt;Let's go.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. What Is React?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React is a JavaScript library built by Facebook (now Meta) in 2013.&lt;/p&gt;

&lt;p&gt;It is used to build user interfaces — the part of the app that users see and interact with.&lt;/p&gt;

&lt;p&gt;React does not replace JavaScript. It is written in JavaScript. But it gives you a smarter, cleaner way to build complex UIs.&lt;/p&gt;

&lt;p&gt;Think of it like this.&lt;/p&gt;

&lt;p&gt;JavaScript is like raw ingredients — flour, eggs, butter. You can make a cake with them, but it takes a lot of effort and the process can get messy fast.&lt;/p&gt;

&lt;p&gt;React is like a baking kit — everything is organized, structured, and designed to make the process faster and less error-prone.&lt;/p&gt;

&lt;p&gt;Same ingredients. Much better result.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. Why Do We Need React Instead of JavaScript?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most important question. Let's be honest about it.&lt;/p&gt;

&lt;p&gt;Plain JavaScript works. You can build anything with it. But as your app grows — things start to break down.&lt;/p&gt;

&lt;p&gt;Here is a real example.&lt;/p&gt;

&lt;p&gt;Imagine you are building a social media feed. You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A list of posts&lt;/li&gt;
&lt;li&gt;A like button on each post&lt;/li&gt;
&lt;li&gt;A comment count that updates when someone comments&lt;/li&gt;
&lt;li&gt;A notification bell that updates when something changes&lt;/li&gt;
&lt;li&gt;A user profile section at the top&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In plain JavaScript — every time something changes, you have to manually find the right element in the DOM and update it.&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="c1"&gt;// Plain JavaScript — updating manually every time&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;like-count&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;notification-bell&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newNotifications&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;comment-count&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newComments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now imagine doing this for 50 different parts of the page.&lt;/p&gt;

&lt;p&gt;It gets messy. It gets slow. And one mistake breaks everything.&lt;/p&gt;

&lt;p&gt;React solves this with one core idea — components and a virtual DOM.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. How React Solves the Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React introduces two things that change everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A component is a small, reusable piece of UI.&lt;/p&gt;

&lt;p&gt;Instead of writing one giant HTML file — you break your page into small independent pieces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;LikeButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Like&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;This is a post&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LikeButton&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each component manages its own logic and display. You build once — use anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Virtual DOM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quick question for you.&lt;/p&gt;

&lt;p&gt;When you click "like" on a post — should the entire page reload? Or just the like count?&lt;/p&gt;

&lt;p&gt;Obviously just the like count.&lt;/p&gt;

&lt;p&gt;But in plain JavaScript, you have to figure that out yourself and manually update the right element.&lt;/p&gt;

&lt;p&gt;React handles this automatically using a Virtual DOM.&lt;/p&gt;

&lt;p&gt;Here is how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React keeps a copy of the real DOM in memory — this is the Virtual DOM&lt;/li&gt;
&lt;li&gt;When something changes, React creates a new Virtual DOM&lt;/li&gt;
&lt;li&gt;It compares the old and new Virtual DOM&lt;/li&gt;
&lt;li&gt;It finds exactly what changed&lt;/li&gt;
&lt;li&gt;It updates only that part in the real DOM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? Faster updates. Less work. No manual DOM hunting.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. What Is a Single Page Application (SPA)?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we go further — you need to understand this concept. Because React is built for it.&lt;/p&gt;

&lt;p&gt;Traditional websites reload the entire page every time you click a link.&lt;/p&gt;

&lt;p&gt;You click "About" — the browser sends a request to the server, the server sends back a whole new HTML page, the browser loads it from scratch.&lt;/p&gt;

&lt;p&gt;That is a Multi Page Application (MPA).&lt;/p&gt;

&lt;p&gt;A Single Page Application works differently.&lt;/p&gt;

&lt;p&gt;The browser loads one HTML page at the start. After that — React takes over. When you navigate, React swaps out just the content on screen. No full page reload. No request to the server for a new page.&lt;/p&gt;

&lt;p&gt;Think of it like a TV.&lt;/p&gt;

&lt;p&gt;When you change channels — the TV itself does not restart. Only what is playing on screen changes.&lt;/p&gt;

&lt;p&gt;That is exactly how an SPA works.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;5. Single Page Application vs Multi Page Application&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Single Page Application (SPA)&lt;/th&gt;
&lt;th&gt;Multi Page Application (MPA)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One HTML file, content swaps on screen&lt;/td&gt;
&lt;td&gt;Separate HTML page for every route&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Page reload&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No full reload on navigation&lt;/td&gt;
&lt;td&gt;Full reload on every navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed after load&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very fast&lt;/td&gt;
&lt;td&gt;Depends on server response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initial load&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slightly slower (loads everything upfront)&lt;/td&gt;
&lt;td&gt;Faster initial load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SEO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Needs extra setup for SEO&lt;/td&gt;
&lt;td&gt;Naturally good for SEO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dashboards, apps, tools&lt;/td&gt;
&lt;td&gt;Blogs, e-commerce, content sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gmail, Notion, Figma&lt;/td&gt;
&lt;td&gt;Wikipedia, news sites, Amazon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Quick question for you.&lt;/p&gt;

&lt;p&gt;When you use Gmail — do you notice the page never fully reloads when you open an email? You just see the email content appear on the right side.&lt;/p&gt;

&lt;p&gt;That is a Single Page Application in action.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;6. How to Set Up React&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are two popular ways to set up a React project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create React App (CRA)&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's understand both before you pick one.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. Create React App (CRA)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CRA was the official way to start a React project for a long time.&lt;/p&gt;

&lt;p&gt;You run one command and it sets up everything for you — React, Webpack, Babel, and a development server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Your React app runs at &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The project structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
  node_modules/
  public/
    index.html
  src/
    App.js
    index.js
  package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;src/App.js&lt;/code&gt; is where you write your React code.&lt;br&gt;
&lt;code&gt;public/index.html&lt;/code&gt; is the single HTML file React injects into.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;8. Vite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vite is a newer and faster build tool.&lt;/p&gt;

&lt;p&gt;It was not built specifically for React — but it supports React very well and has become the preferred choice for most developers today.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create vite@latest my-app &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--template&lt;/span&gt; react
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your React app runs at &lt;code&gt;http://localhost:5173&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The project structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
  node_modules/
  public/
  src/
    App.jsx
    main.jsx
  index.html
  package.json
  vite.config.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Quick Summary — 5 Things to Remember&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React is a JavaScript library&lt;/strong&gt; — used to build user interfaces with reusable components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React solves the DOM problem&lt;/strong&gt; — instead of manually updating the page, React figures out what changed and updates only that part using the Virtual DOM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React is built for SPAs&lt;/strong&gt; — Single Page Applications load once and swap content without full page reloads, making them fast and smooth.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SPA vs MPA&lt;/strong&gt; — SPAs are best for apps and dashboards. MPAs are best for content-heavy sites that need SEO out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use Vite, not CRA&lt;/strong&gt; — CRA is deprecated. Vite is faster, lighter, and actively supported. It is the right choice for every new React project today.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;React can feel like a big jump at first. But once you understand components, state, and how the Virtual DOM works — everything starts to click.&lt;/p&gt;

&lt;p&gt;The best way to learn React is to build something with it. Start small. A counter. A todo list. A weather card.&lt;/p&gt;

&lt;p&gt;Pick one and build it.&lt;/p&gt;

&lt;p&gt;If this helped you understand React better, drop a comment below. What are you planning to build first?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading. Keep building.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Todo List App with HTML, CSS &amp; JS — Here's What I Learned</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Tue, 07 Apr 2026 15:35:51 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/i-built-a-todo-list-app-with-html-css-js-heres-what-i-learned-2aak</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/i-built-a-todo-list-app-with-html-css-js-heres-what-i-learned-2aak</guid>
      <description>&lt;p&gt;Hey! &lt;/p&gt;

&lt;p&gt;I built a Todo List app.&lt;/p&gt;

&lt;p&gt;Simple? Yes. But this project taught me some JavaScript concepts I was avoiding for a long time.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;localStorage&lt;/code&gt;. Dynamic DOM. Event listeners. Array methods.&lt;/p&gt;

&lt;p&gt;All in one small project.&lt;/p&gt;

&lt;p&gt;Let me walk you through what I built — and what actually clicked for me. &lt;/p&gt;

&lt;p&gt;You can check out all my frontend projects &lt;a href="https://dhanraj166.github.io/frontend-projects" rel="noopener noreferrer"&gt;right here&lt;/a&gt;. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. What This Todo App Does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type a task and press &lt;strong&gt;Add&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Task appears in the list below&lt;/li&gt;
&lt;li&gt;Click a task → it gets a &lt;strong&gt;strikethrough&lt;/strong&gt; (marked as done)&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Delete&lt;/strong&gt; → task is removed&lt;/li&gt;
&lt;li&gt;Refresh the page → tasks are &lt;strong&gt;still there&lt;/strong&gt; (thanks to &lt;code&gt;localStorage&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the interesting one. Let's get into it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. The HTML — Just the Skeleton&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"inputText"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your task"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"add-btn"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Add&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's honestly all the HTML needed.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;input id="inputText"&amp;gt;&lt;/code&gt; → where you type the task.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;button id="btn"&amp;gt;&lt;/code&gt; → the Add button.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ul id="list"&amp;gt;&lt;/code&gt; → the list that shows all tasks. Starts empty. JavaScript fills it in.&lt;/p&gt;

&lt;p&gt;No tasks are hardcoded in HTML. Everything is created dynamically by JS. That was new for me. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. The CSS — Two Things I Really Liked&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gradient background:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;radial-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="nb"&gt;top&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#9d61ba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;radial-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="nb"&gt;bottom&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#718777&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#554f75&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two &lt;code&gt;radial-gradient&lt;/code&gt; layers stacked together — purple top left, green bottom right. They blend in the middle. Looks way better than a solid color. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gradient text on the heading:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;135deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#f97aff&lt;/span&gt; &lt;span class="m"&gt;0%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#7afff0&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-clip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-text-fill-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick question for you &lt;/p&gt;

&lt;p&gt;How do you make text show a gradient color?&lt;/p&gt;

&lt;p&gt;You apply a gradient as the &lt;strong&gt;background&lt;/strong&gt; — then clip it to the text shape — then make the text color transparent so the background shows through.&lt;/p&gt;

&lt;p&gt;Three lines working together. The result? Pink to cyan gradient text. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. The JavaScript — This Is Where I Learned the Most&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of dumping the full code at once — let me show you how the app is broken into 4 clear responsibilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Save tasks to browser&lt;/td&gt;
&lt;td&gt;&lt;code&gt;saveTodos()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Draw tasks on screen&lt;/td&gt;
&lt;td&gt;&lt;code&gt;renderTodos()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add a new task&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;btn&lt;/code&gt; click event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load tasks on startup&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;renderTodos()&lt;/code&gt; called once at the end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every action in this app goes through these 4 things.&lt;/p&gt;

&lt;p&gt;Add a task → save → redraw.&lt;br&gt;
Delete a task → save → redraw.&lt;br&gt;
Mark done → save → redraw.&lt;/p&gt;

&lt;p&gt;Simple pattern. Repeated every time. Once I saw that — the whole JS made sense. &lt;/p&gt;

&lt;p&gt;Let's go through the parts that taught me the most. &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;5. &lt;code&gt;localStorage&lt;/code&gt; — Tasks That Don't Disappear&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the biggest thing I learned in this project.&lt;/p&gt;

&lt;p&gt;Normally — when you refresh a page, everything resets. Variables are gone. Your tasks vanish.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;localStorage&lt;/code&gt; fixes that. It saves data &lt;strong&gt;in the browser&lt;/strong&gt; — and it stays there even after a refresh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saving data:&lt;/strong&gt;&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;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;todos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;localStorage&lt;/code&gt; only stores strings. So &lt;code&gt;JSON.stringify()&lt;/code&gt; converts our array into a string first.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;todos&lt;/code&gt; (array) → &lt;code&gt;JSON.stringify&lt;/code&gt; → &lt;code&gt;"[{...},{...}]"&lt;/code&gt; (string) → saved in browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loading data:&lt;/strong&gt;&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;todos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;todos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;localStorage.getItem("todos")&lt;/code&gt; → gets the saved string back.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;JSON.parse()&lt;/code&gt; → converts it back into a real array.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;|| []&lt;/code&gt; → if nothing is saved yet, start with an empty array.&lt;/p&gt;

&lt;p&gt;Quick question for you &lt;/p&gt;

&lt;p&gt;Why do we need both &lt;code&gt;JSON.stringify&lt;/code&gt; and &lt;code&gt;JSON.parse&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;localStorage&lt;/code&gt; only understands strings — not arrays or objects. So we convert to string when saving, and convert back when loading.&lt;/p&gt;

&lt;p&gt;String in. String out. JS array in between.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;6. &lt;code&gt;renderTodos()&lt;/code&gt; — Drawing the List Every Time&lt;/strong&gt;&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;renderTodos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// ...build each task item&lt;/span&gt;
    &lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time something changes — add, delete, mark done — we call &lt;code&gt;renderTodos()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It clears the list with &lt;code&gt;ul.innerHTML = ""&lt;/code&gt; and redraws everything fresh.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;document.createElement("li")&lt;/code&gt; → creates a new &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; element in JavaScript. No HTML needed.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ul.appendChild(li)&lt;/code&gt; → adds it to the page.&lt;/p&gt;

&lt;p&gt;I never created HTML elements from JavaScript before this project. Now it feels natural. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. Marking a Task as Done — Toggle Logic&lt;/strong&gt;&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;li&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;saveTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;renderTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you click a task — it toggles between done and not done.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;!todos[index].done&lt;/code&gt; → if it's &lt;code&gt;true&lt;/code&gt;, make it &lt;code&gt;false&lt;/code&gt;. If it's &lt;code&gt;false&lt;/code&gt;, make it &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That &lt;code&gt;!&lt;/code&gt; flips the value every time. One line. Clean toggle. &lt;/p&gt;

&lt;p&gt;In CSS, when a task is done — we add the class &lt;code&gt;done&lt;/code&gt; which adds a strikethrough:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="nc"&gt;.done&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;line-through&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#9ca3af&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JS handles the logic. CSS handles the look. They work together perfectly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;8. Deleting a Task — &lt;code&gt;splice()&lt;/code&gt;&lt;/strong&gt;&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;delBtn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;saveTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;renderTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;todos.splice(index, 1)&lt;/code&gt; → removes 1 item from the array at position &lt;code&gt;index&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So if you have &lt;code&gt;["Buy milk", "Read book", "Go gym"]&lt;/code&gt; and delete index 1:&lt;/p&gt;

&lt;p&gt;Result → &lt;code&gt;["Buy milk", "Go gym"]&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;"Read book"&lt;/code&gt; is gone. Array updated. Save. Redraw. Done. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;9. The Add Button — Putting It All Together&lt;/strong&gt;&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;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;todos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;saveTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;renderTodos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;inputText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.trim()&lt;/code&gt; → removes empty spaces from the start and end. So just pressing spacebar doesn't add a blank task.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;if (value === "") return&lt;/code&gt; → if the input is empty, stop. Don't add anything.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;todos.push({ text: value, done: false })&lt;/code&gt; → add a new task object to the array. Every task has a &lt;code&gt;text&lt;/code&gt; and a &lt;code&gt;done&lt;/code&gt; status.&lt;/p&gt;

&lt;p&gt;Then save → redraw → clear the input. &lt;/p&gt;

&lt;p&gt;Every. Single. Time. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;10. What This Project Actually Taught Me&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;/strong&gt; — saving and loading data in the browser. &lt;code&gt;JSON.stringify&lt;/code&gt; to save. &lt;code&gt;JSON.parse&lt;/code&gt; to load. I use this in every project now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;document.createElement()&lt;/code&gt;&lt;/strong&gt; — building HTML elements with JavaScript instead of hardcoding them. Powerful once it clicks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;splice()&lt;/code&gt;&lt;/strong&gt; — removing items from an array by index. Simple but I always forgot how it worked before this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Toggle with &lt;code&gt;!&lt;/code&gt;&lt;/strong&gt; — flipping a boolean value in one character. Clean and satisfying.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;renderTodos()&lt;/code&gt; pattern&lt;/strong&gt; — clear and redraw. Simple state management without any library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gradient text with CSS&lt;/strong&gt; — &lt;code&gt;background-clip: text&lt;/code&gt; + &lt;code&gt;transparent fill&lt;/code&gt;. Looks great. One trick I'll use everywhere now.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Quick Summary&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;localStorage.setItem&lt;/code&gt; + &lt;code&gt;JSON.stringify&lt;/code&gt; → saves array as string in browser&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;localStorage.getItem&lt;/code&gt; + &lt;code&gt;JSON.parse&lt;/code&gt; → loads it back as a real array&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;document.createElement()&lt;/code&gt; → builds HTML elements from JavaScript&lt;/li&gt;
&lt;li&gt;Every action follows one pattern → save → redraw → done&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!todo.done&lt;/code&gt; → toggles between true and false&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;renderTodos()&lt;/code&gt; → clears and redraws the list every time something changes&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;You can see my project here: &lt;a href="https://dhanraj166.github.io/frontend-projects/todo" rel="noopener noreferrer"&gt;https://dhanraj166.github.io/frontend-projects/todo&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Build this yourself. It's the perfect beginner project.&lt;/p&gt;

&lt;p&gt;If you build your own version — drop it in the comments. I'd love to see what you make. &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! Keep building — one project at a time.&lt;/em&gt; &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Built a Calculator with HTML, CSS &amp; JS — Here's What I Learned</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Sat, 04 Apr 2026 17:36:05 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/i-built-a-calculator-with-html-css-js-heres-what-i-learned-11h7</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/i-built-a-calculator-with-html-css-js-heres-what-i-learned-11h7</guid>
      <description>&lt;p&gt;Hey! &lt;/p&gt;

&lt;p&gt;I built a calculator using HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;It's a small project. But it taught me things that hours of tutorials didn't.&lt;/p&gt;

&lt;p&gt;Let me walk you through what I built — and what clicked for me along the way. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. What the Calculator Does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type numbers and operators on the screen&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;=&lt;/strong&gt; or &lt;strong&gt;Ans&lt;/strong&gt; to get the result&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;C&lt;/strong&gt; to clear everything&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Del&lt;/strong&gt; to delete the last character&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple. Clean. And building it yourself hits different. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. The HTML — Screen + Buttons&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"result"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"clearDisplay()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;C&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"appendValue('/')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;÷&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"appendValue('*')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;×&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"deleteLast()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Del&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- number and operator buttons --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"equal"&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"calculate()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;=&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;lt;input id="result"&amp;gt;&lt;/code&gt; → the display screen. Shows numbers and the final answer.&lt;/p&gt;

&lt;p&gt;Every button has &lt;code&gt;onclick&lt;/code&gt; → clicking it runs a JavaScript function.&lt;/p&gt;

&lt;p&gt;That's the whole structure. Nothing fancy. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. The CSS — Dark Look with Grid Layout&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background gradient:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;135deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#0f2027&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#203a43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;#2c5364&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three colors blending together — gives that rich dark feel. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The button grid:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;repeat(4, 1fr)&lt;/code&gt; → 4 equal columns. Grid handles all the positioning automatically.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Quick question for you *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why does the &lt;code&gt;0&lt;/code&gt; button look wider than the rest?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.zero&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;grid-column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;span 2&lt;/code&gt; → the zero button takes up 2 columns instead of 1. One line. That's it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hover effect:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#555&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;174&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;167&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.91&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;transition: 0.2s&lt;/code&gt; on the button makes the hover smooth — not a sudden jump. Makes the calculator feel alive. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. The JavaScript — Just 4 Functions&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;appendValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;clearDisplay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deleteLast&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 functions. That's the whole brain of this calculator. Let's go through each one. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;5. &lt;code&gt;appendValue()&lt;/code&gt; — Builds the Expression&lt;/strong&gt;&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;appendValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every button click adds a character to the screen.&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;4&lt;/code&gt; → screen shows &lt;code&gt;4&lt;/code&gt;.&lt;br&gt;
Press &lt;code&gt;+&lt;/code&gt; → screen shows &lt;code&gt;4+&lt;/code&gt;.&lt;br&gt;
Press &lt;code&gt;3&lt;/code&gt; → screen shows &lt;code&gt;4+3&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Just adding characters one by one. Simple. &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;6. &lt;code&gt;clearDisplay()&lt;/code&gt; and &lt;code&gt;deleteLast()&lt;/code&gt;&lt;/strong&gt;&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;clearDisplay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// wipes everything&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deleteLast&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&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="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// removes last character&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;clearDisplay&lt;/code&gt; → sets screen to empty. Fresh start.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deleteLast&lt;/code&gt; → &lt;code&gt;.slice(0, -1)&lt;/code&gt; means "keep everything except the last character."&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;123+&lt;/code&gt; becomes &lt;code&gt;123&lt;/code&gt;. Press again → &lt;code&gt;12&lt;/code&gt;. That's your backspace. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. &lt;code&gt;calculate()&lt;/code&gt; and &lt;code&gt;eval()&lt;/code&gt; — The Interesting One&lt;/strong&gt;&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick question for you &lt;/p&gt;

&lt;p&gt;If the screen shows &lt;code&gt;"45+3"&lt;/code&gt; — that's just a string. Plain text.&lt;/p&gt;

&lt;p&gt;How does JavaScript know it's math?&lt;/p&gt;

&lt;p&gt;That's where &lt;code&gt;eval()&lt;/code&gt; comes in.&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="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;45+3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// 48&lt;/span&gt;
&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10*5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// 50&lt;/span&gt;
&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100/4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// 25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; takes a string and &lt;strong&gt;runs it as JavaScript code&lt;/strong&gt;. So &lt;code&gt;"45+3"&lt;/code&gt; becomes actual math — and returns &lt;code&gt;48&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One line. Whole calculator works. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One thing I learned though →&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;eval()&lt;/code&gt; is powerful but risky in real apps. If someone types harmful code, &lt;code&gt;eval&lt;/code&gt; will run it. For a personal project like this — totally fine. For a real app — use a safer math library.&lt;/p&gt;

&lt;p&gt;Good to know. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;8. What This Project Actually Taught Me&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSS Grid&lt;/strong&gt; — I always used Flexbox. This project made me finally use Grid properly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;grid-column: span 2&lt;/code&gt;&lt;/strong&gt; — one line to make a button wider. Didn't know this before.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.slice(0, -1)&lt;/code&gt;&lt;/strong&gt; — negative numbers in slice. Small but useful trick.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;eval()&lt;/code&gt;&lt;/strong&gt; — what it does, why it works, and when not to use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't learn these things from tutorials. You learn them when you &lt;em&gt;need&lt;/em&gt; them.&lt;/p&gt;




&lt;p&gt;You can see my project here: &lt;a href="https://dhanraj166.github.io/frontend-projects/calculator.html" rel="noopener noreferrer"&gt;https://dhanraj166.github.io/frontend-projects/calculator.html&lt;/a&gt;/&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! Keep building&lt;/em&gt; &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>css</category>
      <category>beginners</category>
    </item>
    <item>
      <title>JavaScript Promises Explained — With a Real Online Shopping Flow</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Sun, 29 Mar 2026 17:03:34 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/javascript-promises-explained-with-a-real-online-shopping-flow-197b</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/javascript-promises-explained-with-a-real-online-shopping-flow-197b</guid>
      <description>&lt;p&gt;Hey! &lt;/p&gt;

&lt;p&gt;You've probably seen the word &lt;strong&gt;Promise&lt;/strong&gt; in JavaScript and thought —&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What is this? Why does it exist? Why can't JavaScript just... do things normally?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fair question. Let's fix that today.&lt;/p&gt;

&lt;p&gt;We're going to use a real online shopping flow to understand Promises — step by step, together.&lt;/p&gt;

&lt;p&gt;And by the end, this code will make complete sense to you. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. What Is a Promise? (Before We Touch the Code)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you order food online.&lt;/p&gt;

&lt;p&gt;The app doesn't freeze while your food is being made. You go about your day. When it's ready — you get a notification.&lt;/p&gt;

&lt;p&gt;That notification? That's a Promise resolving.&lt;/p&gt;

&lt;p&gt;In JavaScript, a &lt;strong&gt;Promise&lt;/strong&gt; is an object that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'll give you a result — but not right now. Give me some time. I'll get back to you."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A Promise has 3 possible states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Pending&lt;/strong&gt; — still working, no result yet&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Resolved&lt;/strong&gt; — finished successfully, here's your result&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Rejected&lt;/strong&gt; — something went wrong, here's the error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now let's see this in real code. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. The Full Code — Look at It Once&lt;/strong&gt;&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkInternet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;online&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;online&lt;/span&gt;&lt;span class="p"&gt;)&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internet connected ✅&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No internet connection ❌&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="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loginUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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="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="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User logged in ✅&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;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkStock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stockAvailable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stockAvailable&lt;/span&gt;&lt;span class="p"&gt;)&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Product in stock ✅&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Product out of stock ❌&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="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;paymentSuccess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentSuccess&lt;/span&gt;&lt;span class="p"&gt;)&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment successful ✅&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment failed ❌&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="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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="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="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Order placed successfully ✅&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;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sendConfirmation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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="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="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Confirmation message sent ✅&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;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;checkInternet&lt;/span&gt;&lt;span class="p"&gt;()&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;loginUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;checkStock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sendConfirmation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&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;Order completed successfully!&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="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;❌ Error:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks long, right?&lt;/p&gt;

&lt;p&gt;Don't worry. We'll break it into small pieces. Each piece is actually very simple.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. What's Actually Happening Here? — The Big Picture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This code simulates a complete online order flow.&lt;/p&gt;

&lt;p&gt;Think of it like this — when you buy something online, the app runs these steps &lt;strong&gt;one after another&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check Internet
     ↓
  Login User
     ↓
 Check Stock
     ↓
Process Payment
     ↓
  Place Order
     ↓
Send Confirmation
     ↓
   Done!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step &lt;strong&gt;waits&lt;/strong&gt; for the previous one to finish before starting.&lt;/p&gt;

&lt;p&gt;That's exactly what Promises and &lt;code&gt;.then()&lt;/code&gt; do.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. Let's Understand One Promise First&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's take the simplest one — &lt;code&gt;checkInternet&lt;/code&gt;.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkInternet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;online&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;online&lt;/span&gt;&lt;span class="p"&gt;)&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internet connected ✅&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No internet connection ❌&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="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's read this line by line 👇&lt;/p&gt;

&lt;p&gt;&lt;code&gt;return new Promise((resolve, reject) =&amp;gt; {&lt;/code&gt;&lt;br&gt;
→ We're creating a new Promise. It takes two things — &lt;code&gt;resolve&lt;/code&gt; and &lt;code&gt;reject&lt;/code&gt;. These are functions JavaScript gives us.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setTimeout(() =&amp;gt; { ... }, 1000)&lt;/code&gt;&lt;br&gt;
→ Wait 1 second before doing anything. This simulates real network delay.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const online = true&lt;/code&gt;&lt;br&gt;
→ This is our fake condition. In a real app, this would check your actual internet.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;if (online) { resolve("Internet connected ✅") }&lt;/code&gt;&lt;br&gt;
→ If internet is available — call &lt;code&gt;resolve&lt;/code&gt;. Promise is &lt;strong&gt;successful&lt;/strong&gt;. ✅&lt;/p&gt;

&lt;p&gt;&lt;code&gt;else { reject("No internet connection ❌") }&lt;/code&gt;&lt;br&gt;
→ If no internet — call &lt;code&gt;reject&lt;/code&gt;. Promise &lt;strong&gt;failed&lt;/strong&gt;. ❌&lt;/p&gt;

&lt;p&gt;That's it. That's one complete Promise.&lt;/p&gt;



&lt;p&gt;*&lt;em&gt;5. Quick Question for You *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Look at &lt;code&gt;loginUser&lt;/code&gt;:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loginUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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="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="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User logged in ✅&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;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Did you notice something different from &lt;code&gt;checkInternet&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Take a second. Look carefully.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;It only has &lt;code&gt;resolve&lt;/code&gt; — no &lt;code&gt;reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Why? Because in this code, login always succeeds. There's no failure case written for it. So we only need &lt;code&gt;resolve&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Simple — but important to notice. 👀&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;6. Now Let's Talk About &lt;code&gt;resolve&lt;/code&gt; and &lt;code&gt;reject&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These two are the heart of every Promise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;resolve&lt;/code&gt;&lt;/strong&gt; → "Everything went well. Here's the result. Move to the next step."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;reject&lt;/code&gt;&lt;/strong&gt; → "Something went wrong. Stop here. Jump to &lt;code&gt;.catch()&lt;/code&gt;."&lt;/p&gt;

&lt;p&gt;Here's a clear picture of which functions can fail and which always succeed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Can Fail?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;checkInternet()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Internet might be off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;loginUser()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Always resolves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;checkStock()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Item might be out of stock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;processPayment()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Payment might fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;placeOrder()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Always resolves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sendConfirmation()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Always resolves&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Functions that &lt;strong&gt;can fail&lt;/strong&gt; have both &lt;code&gt;resolve&lt;/code&gt; and &lt;code&gt;reject&lt;/code&gt;.&lt;br&gt;
Functions that &lt;strong&gt;always succeed&lt;/strong&gt; only have &lt;code&gt;resolve&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;7. What Does &lt;code&gt;.then()&lt;/code&gt; Actually Do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now the fun part. Look at how we run all 6 steps:&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="nf"&gt;checkInternet&lt;/span&gt;&lt;span class="p"&gt;()&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;loginUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;checkStock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;})&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="nx"&gt;result&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's understand &lt;code&gt;.then()&lt;/code&gt; clearly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.then()&lt;/code&gt; runs &lt;strong&gt;only when the previous Promise resolves successfully&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It receives the resolved value as &lt;code&gt;result&lt;/code&gt; — and you can use it however you want.&lt;/p&gt;

&lt;p&gt;Then — you &lt;code&gt;return&lt;/code&gt; the next Promise inside it. That's what creates the chain.&lt;/p&gt;

&lt;p&gt;Think of it like a relay race :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Runner 1 finishes → passes the baton → Runner 2 starts → passes the baton → Runner 3 starts...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each &lt;code&gt;.then()&lt;/code&gt; is one runner. Each &lt;code&gt;return&lt;/code&gt; is passing the baton.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;8. Step-by-Step Output — Let's Walk Through It Together&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what happens when you run this code:&lt;/p&gt;

&lt;p&gt;Waits 1 second...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet connected ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Waits 1 more second...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User logged in ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Waits 1.5 seconds...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product in stock ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Waits 2 seconds...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment successful ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Waits 1 second...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order placed successfully ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Waits 1 second...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Confirmation message sent ✅
 Order completed successfully!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step runs &lt;strong&gt;one at a time, in order&lt;/strong&gt;. The next step never starts before the previous one finishes.&lt;/p&gt;

&lt;p&gt;That's the power of Promise chaining.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;9. What About &lt;code&gt;.catch()&lt;/code&gt;? — The Safety Net&lt;/strong&gt;&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="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;❌ Error:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is your safety net. &lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;any&lt;/strong&gt; Promise in the entire chain calls &lt;code&gt;reject&lt;/code&gt; — the whole chain stops and jumps straight to &lt;code&gt;.catch()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's say you change this in &lt;code&gt;checkStock&lt;/code&gt;:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stockAvailable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//  changed to false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet connected ✅
User logged in ✅
❌ Error: Product out of stock ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything after &lt;code&gt;checkStock&lt;/code&gt; — payment, order, confirmation — &lt;strong&gt;none of it runs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One failure. Whole chain stops. &lt;code&gt;.catch()&lt;/code&gt; handles it.&lt;/p&gt;

&lt;p&gt;Clean. Safe. Controlled.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;10. Small Challenge for You *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before you move on — try this mentally.&lt;/p&gt;

&lt;p&gt;What happens if you change this line in &lt;code&gt;processPayment&lt;/code&gt;:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;paymentSuccess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What will the output be?&lt;/p&gt;

&lt;p&gt;Think about it.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet connected ✅
User logged in ✅
Product in stock ✅
❌ Error: Payment failed ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The chain ran fine until payment failed. Then &lt;code&gt;.catch()&lt;/code&gt; caught it. Order never placed. Confirmation never sent.&lt;/p&gt;

&lt;p&gt;Makes sense, right? That's exactly how real apps work.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Quick Summary — 5 Things to Remember&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Promise = a future result&lt;/strong&gt; — it's either going to succeed (&lt;code&gt;resolve&lt;/code&gt;) or fail (&lt;code&gt;reject&lt;/code&gt;). Not both.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;resolve&lt;/code&gt; = success&lt;/strong&gt; — moves to the next &lt;code&gt;.then()&lt;/code&gt; in the chain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;reject&lt;/code&gt; = failure&lt;/strong&gt; — skips everything and jumps straight to &lt;code&gt;.catch()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;.then()&lt;/code&gt; chains steps&lt;/strong&gt; — each step waits for the previous one to finish before starting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;.catch()&lt;/code&gt; is your safety net&lt;/strong&gt; — one place to handle any error from anywhere in the chain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Promises feel confusing at first because they're about &lt;em&gt;time&lt;/em&gt; — things happening later, not immediately.&lt;/p&gt;

&lt;p&gt;But once you see it as a relay race — one step finishing and passing to the next — it starts to click.&lt;/p&gt;

&lt;p&gt;Try running this code yourself. Change &lt;code&gt;true&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; in different places and watch what happens. That hands-on experiment will teach you more than any explanation. &lt;/p&gt;

&lt;p&gt;Got a question? Drop it in the comments.  No question is too basic — ask away.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! Keep building, one Promise at a time.&lt;/em&gt; &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Problem-Solving Is More Important Than Programming Languages</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Sat, 28 Mar 2026 06:13:57 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/why-problem-solving-is-more-important-than-programming-languages-1b7i</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/why-problem-solving-is-more-important-than-programming-languages-1b7i</guid>
      <description>&lt;p&gt;Hey! &lt;/p&gt;

&lt;p&gt;Quick question before we start.&lt;/p&gt;

&lt;p&gt;When someone asks you &lt;em&gt;"which programming language should I learn first?"&lt;/em&gt; — what do you usually say?&lt;/p&gt;

&lt;p&gt;Python? JavaScript? Java? C++?&lt;/p&gt;

&lt;p&gt;Here's the thing. That question itself might be the wrong question.&lt;/p&gt;

&lt;p&gt;And today, let's talk about why.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. The Mistake Almost Every Beginner Makes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When most people start coding, they spend weeks asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Should I learn Python or JavaScript?"&lt;br&gt;
"Is Java still worth it?"&lt;br&gt;
"What language do big companies use?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;It's okay. We've all been there.&lt;/p&gt;

&lt;p&gt;But here's what nobody tells you early enough — &lt;strong&gt;the language is just a tool&lt;/strong&gt;. What actually matters is whether you know how to think through a problem before you even open your code editor.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;2. Let's Try Something Together *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Forget code for a second.&lt;/p&gt;

&lt;p&gt;Imagine your friend asks you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I have a box of 10 chocolates. I want to share them equally with 4 people. Can I do it?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You didn't need Python to answer that. You didn't need JavaScript.&lt;/p&gt;

&lt;p&gt;You just &lt;em&gt;thought through it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That thinking — breaking a problem into pieces, figuring out what's possible, finding the answer — &lt;strong&gt;that's problem-solving&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that's exactly what programming is. The language is just how you write the solution down.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. Here's a Real Example in Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's say someone asks you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find the largest number in a list."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A beginner who only focused on syntax might freeze. They'll think — &lt;em&gt;"What method do I use? Is it &lt;code&gt;.max()&lt;/code&gt;? &lt;code&gt;.sort()&lt;/code&gt;? How do I write this?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But a developer who thinks in problems first does this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with the first number. Assume it's the largest.&lt;/li&gt;
&lt;li&gt;Go through every other number.&lt;/li&gt;
&lt;li&gt;If you find a bigger one, update your answer.&lt;/li&gt;
&lt;li&gt;At the end, you have the largest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Now the code almost writes itself:&lt;/strong&gt;&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;findLargest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;largest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&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="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;largest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;largest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;largest&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="nf"&gt;findLargest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;span class="c1"&gt;// Output: 9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See what happened there?&lt;/p&gt;

&lt;p&gt;The logic came first. The code came second.&lt;/p&gt;

&lt;p&gt;That's the mindset shift everything depends on.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;4. Quick Question for You *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If someone took that same logic and wrote it in Python — would it still work?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_largest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;largest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;largest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find_largest&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="c1"&gt;# Output: 9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same logic. Different language. Same result.&lt;/p&gt;

&lt;p&gt;The problem-solving didn't change. Only the syntax did.&lt;/p&gt;

&lt;p&gt;That's the whole point.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;5. So Why Do People Focus on Languages So Much?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Honestly? Because languages are &lt;em&gt;visible&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You can google "Python tutorial." You can finish a course and say "I learned Python." It feels like progress.&lt;/p&gt;

&lt;p&gt;But problem-solving is invisible. It's harder to measure. It grows slowly. And nobody gives you a certificate for it.&lt;/p&gt;

&lt;p&gt;So people avoid it — without even realizing they're avoiding it.&lt;/p&gt;

&lt;p&gt;But here's the truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A developer who thinks clearly can pick up any language in weeks.&lt;br&gt;
A developer who only knows syntax will struggle in every language.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;*&lt;em&gt;6. Think About It This Way *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Imagine two people want to build a house.&lt;/p&gt;

&lt;p&gt;Person A studies every tool in the toolbox. Hammer. Drill. Saw. They know the names, the brands, the specs.&lt;/p&gt;

&lt;p&gt;Person B learns how buildings actually work. Foundations. Load-bearing walls. How rooms connect.&lt;/p&gt;

&lt;p&gt;Now give both of them a new tool they've never seen.&lt;/p&gt;

&lt;p&gt;Who figures it out faster?&lt;/p&gt;

&lt;p&gt;Person B. Every time.&lt;/p&gt;

&lt;p&gt;Languages are the tools. Problem-solving is understanding how buildings work.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. What Does "Thinking Like a Developer" Actually Look Like?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what it looks like in practice. Someone gives you a problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Check if a word is a palindrome." (a word that reads the same forwards and backwards — like &lt;em&gt;racecar&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before writing a single line of code, a good developer asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly am I checking?&lt;/li&gt;
&lt;li&gt;What does the input look like?&lt;/li&gt;
&lt;li&gt;What should the output be?&lt;/li&gt;
&lt;li&gt;What's the simplest way to check this?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then they think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If I reverse the word and it's the same — it's a palindrome."&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reversed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;reversed&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="nf"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;racecar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true&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="nf"&gt;isPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;   &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution is clean because the thinking was clear.&lt;/p&gt;

&lt;p&gt;That's not about JavaScript. That's about &lt;em&gt;how you approached the problem&lt;/em&gt;.&lt;/p&gt;




&lt;p&gt;*&lt;em&gt;8. A Small Challenge for You *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Try this without looking anything up.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write the logic — not the code — to check if a number is even or odd.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just words. No syntax. No googling.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;Done? Great.&lt;/p&gt;

&lt;p&gt;If you said something like &lt;em&gt;"divide the number by 2 and check if there's a remainder"&lt;/em&gt; — you just problem-solved.&lt;/p&gt;

&lt;p&gt;Now the code is easy:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&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="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// true&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="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You didn't need to know JavaScript to figure that out.&lt;/p&gt;

&lt;p&gt;You needed to think.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;9. Does This Mean Languages Don't Matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not at all!&lt;/p&gt;

&lt;p&gt;Languages absolutely matter. You need to know the syntax. You need to understand how a language works. That's real and important.&lt;/p&gt;

&lt;p&gt;But think of it like learning to drive.&lt;/p&gt;

&lt;p&gt;Understanding road rules, reading traffic, making decisions — that's the core skill.&lt;/p&gt;

&lt;p&gt;The car you drive is the language. A good driver can switch cars. A person who only memorized one car's dashboard will struggle in a different one.&lt;/p&gt;

&lt;p&gt;Learn the language. But build the thinking first.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;10. How Do You Actually Get Better at Problem-Solving?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what actually works — and you can start today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read problems out loud&lt;/strong&gt; before coding. Understand what's really being asked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write your logic in plain English first.&lt;/strong&gt; If you can't explain it in words, you can't write it in code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice on paper or a whiteboard.&lt;/strong&gt; No autocomplete. No shortcuts. Pure thinking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do easy problems on platforms like LeetCode or HackerRank&lt;/strong&gt; — not to grind hard problems, but to build the habit of breaking things down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After solving, ask yourself&lt;/strong&gt; — is there a simpler way?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these require a specific language.&lt;/p&gt;

&lt;p&gt;All of them make you better in every language.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Quick Summary — 3 Things to Take Away&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Languages are tools, not the skill&lt;/strong&gt; — knowing 5 languages with weak problem-solving won't take you far. Strong thinking with one language will.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logic first, syntax second&lt;/strong&gt; — always understand what you're solving before you think about how to write it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Problem-solving transfers everywhere&lt;/strong&gt; — learn it once, use it in Python, JavaScript, Java, whatever comes next.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! Keep thinking, keep building.&lt;/em&gt; ✨&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>JavaScript Closures — Explained with a Bank Account You'll Never Forget</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Thu, 26 Mar 2026 14:43:22 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/javascript-closures-explained-with-a-bank-account-youll-never-forget-190d</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/javascript-closures-explained-with-a-bank-account-youll-never-forget-190d</guid>
      <description>&lt;p&gt;Hey! &lt;/p&gt;

&lt;p&gt;Before we start — have you ever tried to understand closures and ended up more confused than before?&lt;/p&gt;

&lt;p&gt;Yeah. Most beginners have. And it's not your fault.&lt;/p&gt;

&lt;p&gt;The definitions are dry. The examples feel random. Nothing &lt;em&gt;clicks&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So today, let's skip the textbook stuff. We'll use a &lt;strong&gt;real bank account&lt;/strong&gt; to understand closures — step by step, together.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. What Is a Closure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the simplest way to think about it.&lt;/p&gt;

&lt;p&gt;Imagine a bank. When you open an account, the bank keeps your balance locked inside a private vault. You can't just walk in and grab it. You have to go through the bank's system — deposit, withdraw, check balance.&lt;/p&gt;

&lt;p&gt;That vault? That's a closure in JavaScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A closure is when an inner function remembers the variables from its outer function — even after the outer function has stopped running.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We'll see exactly what that means in code. Keep reading.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. Here's Our Bank Account Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's look at the full example first. Don't worry if you don't get everything right away — we'll walk through it piece by piece.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialBalance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialBalance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;//  private — no one can touch this directly&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;accountNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; deposited ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Balance: ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Insufficient balance&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;balance&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; withdrew ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Balance: ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'s balance is ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;accountNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getBalance&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;createAccount&lt;/code&gt; is the &lt;strong&gt;outer function&lt;/strong&gt; — it's like the bank itself.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;balance&lt;/code&gt; and &lt;code&gt;userName&lt;/code&gt; are private variables — they live inside the bank vault.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deposit&lt;/code&gt;, &lt;code&gt;withdraw&lt;/code&gt;, and &lt;code&gt;getBalance&lt;/code&gt; are the &lt;strong&gt;inner functions&lt;/strong&gt; — they're the only keys to that vault.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. So Where Does the Closure Happen?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the interesting part.&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;createAccount&lt;/code&gt; finishes running — it's done. Gone. But look what we return:&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;accountNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getBalance&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're returning the inner functions. And those functions &lt;strong&gt;still remember&lt;/strong&gt; &lt;code&gt;balance&lt;/code&gt; and &lt;code&gt;userName&lt;/code&gt; from inside &lt;code&gt;createAccount&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That memory? That's the closure.&lt;/p&gt;

&lt;p&gt;Think of it this way — even after a bank branch closes for the day, your account data is still safely stored inside. The branch is gone, but your balance is alive and well.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. Let's Create Some Accounts and See It in Action&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ravi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Karthik&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each call to &lt;code&gt;createAccount&lt;/code&gt; creates a &lt;strong&gt;separate closure&lt;/strong&gt; — a separate private vault for each user.&lt;/p&gt;

&lt;p&gt;Ravi has his own &lt;code&gt;balance&lt;/code&gt;. Anu has hers. Karthik has his.&lt;/p&gt;

&lt;p&gt;They don't share anything. &lt;/p&gt;

&lt;p&gt;Now let's use them:&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// Ravi's balance is ₹1000&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Ravi deposited ₹500. Balance: ₹1500&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="nx"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Anu withdrew ₹1000. Balance: ₹4000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice — when Anu withdraws ₹1000, Ravi's balance doesn't change at all. Each closure is its own world.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;5. Quick Question for You 🤔&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try guessing this before you read the answer.&lt;/p&gt;

&lt;p&gt;What happens when you do this?&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go on, take a guess.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;The answer is &lt;code&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Why? Because &lt;code&gt;balance&lt;/code&gt; is not part of the returned object. It's locked inside the closure. The only way to read it is through &lt;code&gt;getBalance()&lt;/code&gt; — not directly.&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;data privacy&lt;/strong&gt;, powered by closures.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;6. There's a Sneaky Bug — Did You Spot It?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Look at these two lines:&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="nx"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// ❌ oops&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;// ✅ correct&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the difference? The first one is missing &lt;code&gt;()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Without &lt;code&gt;()&lt;/code&gt;, you're not calling the function — you're just pointing at it. JavaScript will print this instead:&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="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always use &lt;code&gt;()&lt;/code&gt; when you want to actually &lt;strong&gt;run&lt;/strong&gt; a function. Small thing — big difference.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. The Mental Model — Vault + Keys 🗝️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's a picture to lock this in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createAccount("Ravi", 1000)
│
├── 🔒 Private Vault (the closure)
│     ├── balance = 1000
│     └── userName = "Ravi"
│
└── 🗝️ Your Keys (returned methods)
      ├── deposit()    → adds to balance
      ├── withdraw()   → subtracts from balance
      └── getBalance() → reads the balance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You hold the keys. But the vault stays hidden.&lt;/p&gt;

&lt;p&gt;No one else can open it. No one else can change the balance — unless they go through the keys you have.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;8. One More Thing — Try This Yourself!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open your browser console or a JS playground and run this:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Karthik&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&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="nx"&gt;user3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// What do you think this prints?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Take a guess before you run it.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;It prints &lt;code&gt;"Insufficient balance"&lt;/code&gt; — because Karthik only has ₹200 and tried to withdraw ₹500.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;withdraw&lt;/code&gt; function checked &lt;code&gt;balance&lt;/code&gt; through the closure and protected the account. 💪&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Quick Summary — 3 Things to Remember&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A closure remembers&lt;/strong&gt; — inner functions keep access to outer variables even after the outer function is done.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Each call is its own world&lt;/strong&gt; — every &lt;code&gt;createAccount&lt;/code&gt; call creates a fresh, isolated closure. Ravi and Anu never share data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Closures = privacy&lt;/strong&gt; — &lt;code&gt;balance&lt;/code&gt; isn't exposed directly. You can only interact with it through the functions returned. That's intentional and powerful.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Thanks for reading! Keep building, keep asking questions.&lt;/em&gt; ✨&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🔐 JavaScript Closures Explained with a Bank Account (Beginners, This One's for You!)</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Thu, 26 Mar 2026 14:33:50 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/javascript-closures-explained-with-a-bank-account-beginners-this-ones-for-you-1cm4</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/javascript-closures-explained-with-a-bank-account-beginners-this-ones-for-you-1cm4</guid>
      <description>&lt;p&gt;Ever wondered how a bank keeps your balance private — so no one else can just walk in and change it?&lt;/p&gt;

&lt;p&gt;That's exactly what a &lt;strong&gt;closure&lt;/strong&gt; does in JavaScript. It locks your data away and only lets you touch it through specific actions — like a deposit or withdrawal.&lt;/p&gt;

&lt;p&gt;Let's break it down with a real banking example. 🏦&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. What Is a Closure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you open a bank account. The bank creates a &lt;strong&gt;private locker&lt;/strong&gt; for you — your balance, your account number. No one else can access it directly. You can only interact with it through the bank's services: deposit, withdraw, check balance.&lt;/p&gt;

&lt;p&gt;In JavaScript, a &lt;strong&gt;closure&lt;/strong&gt; is when an inner function "remembers" the variables from the outer function — even after the outer function has finished running.&lt;/p&gt;

&lt;p&gt;That's it. That's the whole idea. 🎉&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. What Does the Code Look Like?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the full &lt;code&gt;createAccount&lt;/code&gt; function we'll be working with:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialBalance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;initialBalance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// private&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;accountNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; deposited ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Balance: ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Insufficient balance&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;balance&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; withdrew ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Balance: ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'s balance is ₹&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;accountNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;getBalance&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;createAccount&lt;/code&gt; is the &lt;strong&gt;outer function&lt;/strong&gt;. It holds &lt;code&gt;balance&lt;/code&gt; and &lt;code&gt;userName&lt;/code&gt; as private variables inside it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deposit&lt;/code&gt;, &lt;code&gt;withdraw&lt;/code&gt;, and &lt;code&gt;getBalance&lt;/code&gt; are the &lt;strong&gt;inner functions&lt;/strong&gt;. Each one is a closure — they can all see and use &lt;code&gt;balance&lt;/code&gt; even after &lt;code&gt;createAccount&lt;/code&gt; has finished running.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. Why Can Inner Functions Still Access &lt;code&gt;balance&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When &lt;code&gt;createAccount&lt;/code&gt; runs and returns, you'd think &lt;code&gt;balance&lt;/code&gt; is gone forever, right?&lt;/p&gt;

&lt;p&gt;Nope. 🙅&lt;/p&gt;

&lt;p&gt;JavaScript keeps &lt;code&gt;balance&lt;/code&gt; alive in memory because the inner functions still hold a &lt;strong&gt;reference&lt;/strong&gt; to it. This "remembered environment" is called the &lt;strong&gt;closure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of it like this — even after the bank teller goes home, your locker is still safely locked inside the vault. The locker doesn't disappear. It stays as long as you still hold the keys.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. How Does Each User Get Their Own Private Balance?&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ravi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Karthik&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every call to &lt;code&gt;createAccount&lt;/code&gt; creates a &lt;strong&gt;brand new closure&lt;/strong&gt; — a completely separate private environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;user1&lt;/code&gt; gets its own &lt;code&gt;balance&lt;/code&gt; starting at ₹1000&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user2&lt;/code&gt; gets its own &lt;code&gt;balance&lt;/code&gt; starting at ₹5000&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user3&lt;/code&gt; gets its own &lt;code&gt;balance&lt;/code&gt; starting at ₹200&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ravi's deposit will never affect Anu's balance. Each account is fully isolated. 🔒&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;5. How Do You Use the Returned Methods?&lt;/strong&gt;&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// Ravi's balance is ₹1000&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Ravi deposited ₹500. Balance: ₹1500&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="nx"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// Anu withdrew ₹1000. Balance: ₹4000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time you call &lt;code&gt;user1.deposit(500)&lt;/code&gt;, the closure remembers Ravi's &lt;code&gt;balance&lt;/code&gt; and updates it. The next time you call &lt;code&gt;user1.getBalance()&lt;/code&gt;, it shows the updated value.&lt;/p&gt;

&lt;p&gt;The closure is keeping score behind the scenes — silently, reliably. 📝&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;6. There's a Bug in the Code — Did You Catch It?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Look at this line from the original 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="nx"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// ❌ Missing ()&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;// ✅ Correct&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;user2.getBalance&lt;/code&gt; without &lt;code&gt;()&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; call the function. It just prints the function itself:&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="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always add &lt;code&gt;()&lt;/code&gt; when you actually want to &lt;strong&gt;call&lt;/strong&gt; the function and get a result. Easy mistake — now you'll never forget! 😄&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. Why Is &lt;code&gt;balance&lt;/code&gt; Considered "Private"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try accessing &lt;code&gt;balance&lt;/code&gt; directly from outside:&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="nx"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns &lt;code&gt;undefined&lt;/code&gt; because &lt;code&gt;balance&lt;/code&gt; is not part of the returned object. It lives only inside the closure.&lt;/p&gt;

&lt;p&gt;The only way to read or change it is through &lt;code&gt;deposit()&lt;/code&gt;, &lt;code&gt;withdraw()&lt;/code&gt;, or &lt;code&gt;getBalance()&lt;/code&gt;. That's &lt;strong&gt;data privacy&lt;/strong&gt; powered by closures — no one can sneak in and tamper with it directly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;8. The Mental Model — Picture It Like This&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createAccount("Ravi", 1000)
│
├── 🔒 Private Vault (closure)
│     ├── balance = 1000
│     └── userName = "Ravi"
│
└── 🗝️ Keys Returned to You
      ├── deposit()    → updates balance
      ├── withdraw()   → updates balance
      └── getBalance() → reads balance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The vault is the closure. The keys are the inner functions. You can only touch what's inside through the keys.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Quick Summary — 3 Golden Rules of Closures&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inner functions remember outer variables&lt;/strong&gt; — even after the outer function has finished running, the inner functions still hold on to those variables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Each function call creates its own closure&lt;/strong&gt; — &lt;code&gt;user1&lt;/code&gt;, &lt;code&gt;user2&lt;/code&gt;, and &lt;code&gt;user3&lt;/code&gt; each have their own private &lt;code&gt;balance&lt;/code&gt; that never leaks into each other.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Closures give you data privacy&lt;/strong&gt; — if &lt;code&gt;balance&lt;/code&gt; isn't in the returned object, no one outside can access or modify it directly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Closures sound scary at first — but once you picture them as a private vault with keys, they just click. 🔑&lt;/p&gt;

&lt;p&gt;Drop a comment if you have questions. And if this made closures finally make sense, smash that ❤️ and share it with a friend who's learning JavaScript. 🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>The DOM and CRUD in JavaScript</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Wed, 25 Mar 2026 14:12:27 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/the-dom-and-crud-in-javascript-3pk2</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/the-dom-and-crud-in-javascript-3pk2</guid>
      <description>&lt;p&gt;Have you ever wondered how clicking a button on a webpage makes something appear or disappear? That's the magic of the &lt;strong&gt;DOM&lt;/strong&gt; and &lt;strong&gt;CRUD&lt;/strong&gt; in JavaScript. Let's break it down super simply.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is the DOM?
&lt;/h2&gt;

&lt;p&gt;DOM stands for &lt;strong&gt;Document Object Model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of your webpage like a &lt;strong&gt;family tree&lt;/strong&gt;. At the top is the grandparent (&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;), then come the parents (&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;), then children (&lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;), and so on.&lt;/p&gt;

&lt;p&gt;The DOM is just JavaScript's way of &lt;strong&gt;seeing and touching&lt;/strong&gt; that family tree.&lt;/p&gt;

&lt;p&gt;When your browser loads a webpage, it turns all your HTML into a tree of objects. JavaScript can then &lt;strong&gt;read, change, add, or remove&lt;/strong&gt; anything on that tree.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello, World!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript sees this as a tree it can play with.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Do We Use the DOM?
&lt;/h2&gt;

&lt;p&gt;Without the DOM, your webpage would just sit there — like a painting. Nothing would move or change.&lt;/p&gt;

&lt;p&gt;With the DOM, JavaScript can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change text on the screen&lt;/li&gt;
&lt;li&gt;Add new buttons or boxes&lt;/li&gt;
&lt;li&gt;Remove things you don't need&lt;/li&gt;
&lt;li&gt;React when someone clicks or types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: &lt;strong&gt;the DOM makes your webpage alive and interactive.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. What is CRUD?
&lt;/h2&gt;

&lt;p&gt;CRUD is just a fancy word for 4 basic things you do with stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt; — Create (make something new)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt; — Read (look at something)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;U&lt;/strong&gt; — Update (change something)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt; — Delete (remove something)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like your toy box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;add&lt;/strong&gt; a new toy (Create)&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;look&lt;/strong&gt; at your toys (Read)&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;swap&lt;/strong&gt; a toy's color (Update)&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;throw away&lt;/strong&gt; a broken toy (Delete)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the DOM, we do the exact same thing — but with HTML elements on a webpage.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. CRUD Operations in the DOM
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create — Add a New Element
&lt;/h3&gt;

&lt;p&gt;You can create a new HTML element and put it on the page.&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="c1"&gt;// Create a new paragraph&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newPara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Give it some text&lt;/span&gt;
&lt;span class="nx"&gt;newPara&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I was just born!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Add it to the body&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newPara&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;document.createElement('p')&lt;/code&gt; — makes a new &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tag in memory.&lt;br&gt;&lt;br&gt;
&lt;code&gt;appendChild()&lt;/code&gt; — places it inside the body so it shows on screen.&lt;/p&gt;


&lt;h3&gt;
  
  
  Read — Find and Look at an Element
&lt;/h3&gt;

&lt;p&gt;You can find any element on the page and read what's inside it.&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="c1"&gt;// Find the element with id="title"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Read its text&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="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Hello, World!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other ways to find elements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;document.querySelector('.classname')&lt;/code&gt; — finds by class&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;document.querySelectorAll('p')&lt;/code&gt; — finds ALL paragraphs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Update — Change an Element
&lt;/h3&gt;

&lt;p&gt;Once you find an element, you can change its text, color, style — anything!&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="c1"&gt;// Find the title&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Change its text&lt;/span&gt;
&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, DOM!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Change its color&lt;/span&gt;
&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&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;You can also change the HTML inside an element using &lt;code&gt;innerHTML&lt;/code&gt;:&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;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;strong&amp;gt;Bold Title Now!&amp;lt;/strong&amp;gt;&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;h3&gt;
  
  
  Delete — Remove an Element
&lt;/h3&gt;

&lt;p&gt;You can remove any element from the page completely.&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="c1"&gt;// Find the element&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;para&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myPara&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Remove it&lt;/span&gt;
&lt;span class="nx"&gt;para&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Gone. Like it never existed.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. A Full Mini Example
&lt;/h2&gt;

&lt;p&gt;Here's a tiny app that does all 4 CRUD things together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Original Message&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"createItem()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Create&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"readItem()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Read&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"updateItem()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Update&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"deleteItem()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Delete&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="c1"&gt;// CREATE&lt;/span&gt;
      &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createItem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;newEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newItem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;newEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I am a new item!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newEl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// READ&lt;/span&gt;
      &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;readItem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Current text: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// UPDATE&lt;/span&gt;
      &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;updateItem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Message Updated!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&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="c1"&gt;// DELETE&lt;/span&gt;
      &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;deleteItem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newItem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try pasting this in your browser and clicking the buttons!&lt;/p&gt;




&lt;h2&gt;
  
  
  3 Golden Rules 🏆
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The DOM is your webpage's remote control&lt;/strong&gt; — use JavaScript to find, change, add, or remove anything on screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRUD is just 4 actions&lt;/strong&gt; — Create, Read, Update, Delete. Master these and you can build almost anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always find before you change&lt;/strong&gt; — use &lt;code&gt;getElementById&lt;/code&gt; or &lt;code&gt;querySelector&lt;/code&gt; to grab the element first, then do stuff with it.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Understanding createElement() in JavaScript</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Tue, 24 Mar 2026 15:35:20 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/understanding-createelement-in-javascript-587b</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/understanding-createelement-in-javascript-587b</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. What is createElement()?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;createElement()&lt;/code&gt; is a built-in JavaScript method that lets you create a brand new HTML element from scratch — without touching your HTML file.&lt;/p&gt;

&lt;p&gt;You can create a button, a paragraph, a div, or any HTML tag you want — right from JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic Syntax:&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newElement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tagName&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;For example, to create a new paragraph:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;para&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;para&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, I am a new paragraph!&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;This creates a &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; element in memory. But it won't appear on the page yet — you have to &lt;strong&gt;place&lt;/strong&gt; it somewhere.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. Why Do We Use createElement()?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you run an online to-do list app. Every time the user types a task and clicks "Add", a new item should appear. You cannot hardcode that in HTML — you don't know what the user will type!&lt;/p&gt;

&lt;p&gt;That's where &lt;code&gt;createElement()&lt;/code&gt; saves the day. It lets you &lt;strong&gt;dynamically add content&lt;/strong&gt; to the page based on user actions, API data, or any logic.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. Add Element at the LAST Position&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the most common use case. Use &lt;code&gt;appendChild()&lt;/code&gt; to add your new element at the &lt;strong&gt;end&lt;/strong&gt; of a parent.&lt;/p&gt;

&lt;p&gt;Think of it like adding a new dish at the bottom of the menu.&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="c1"&gt;// script.js&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Item 4 (added at last)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;appendChild()&lt;/code&gt; always adds the element as the &lt;strong&gt;last child&lt;/strong&gt; of the parent.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;4. Add Element at the FIRST Position&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now say you want the new item to appear at the &lt;strong&gt;top&lt;/strong&gt;. Use &lt;code&gt;insertBefore()&lt;/code&gt; with the first child as the reference.&lt;/p&gt;

&lt;p&gt;Like putting a "Chef's Special" dish at the very top of the menu.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Item 0 (added at first)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Insert before the first existing child&lt;/span&gt;
&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstChild&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;list.firstChild&lt;/code&gt; points to the first item in the list. By passing it to &lt;code&gt;insertBefore()&lt;/code&gt;, we place our new element &lt;strong&gt;before&lt;/strong&gt; it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Use &lt;code&gt;list.firstElementChild&lt;/code&gt; instead of &lt;code&gt;list.firstChild&lt;/code&gt; to avoid accidentally targeting text nodes (whitespace) in some browsers.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstElementChild&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;5. Add Element at a SPECIFIC Position&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What if you want the new item to appear after Item 2? You pick the exact reference point.&lt;/p&gt;

&lt;p&gt;Like inserting a new dish between "Starters" and "Mains" on the menu.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Item 2.5 (added in between)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Get all current items&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Insert after Item 2, which is index 1 (0-based)&lt;/span&gt;
&lt;span class="c1"&gt;// To insert AFTER index 1, we reference index 2&lt;/span&gt;
&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;insertBefore(newElement, referenceElement)&lt;/code&gt; places the new element &lt;strong&gt;right before&lt;/strong&gt; the reference. So if you pass &lt;code&gt;items[2]&lt;/code&gt; (which is Item 3), the new item lands just before it — which is after Item 2.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;6. Bonus: Using insertAdjacentElement() for More Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's another method that gives you 4 precise positions in one neat package:&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;targetElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertAdjacentElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Where it goes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'beforebegin'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Before the target element itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'afterbegin'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inside target, before its first child&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'beforeend'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inside target, after its last child&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;'afterend'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After the target element itself&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Inserted using insertAdjacentElement&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Insert after Item 2 (index 1)&lt;/span&gt;
&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;insertAdjacentElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;afterend&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This places the new item &lt;strong&gt;right after&lt;/strong&gt; Item 2. Clean and readable!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;7. Quick Summary of All Methods&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Add at the end&lt;/td&gt;
&lt;td&gt;&lt;code&gt;parent.appendChild(newEl)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add at the beginning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;parent.insertBefore(newEl, parent.firstElementChild)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add at a specific spot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;parent.insertBefore(newEl, referenceEl)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-grained positioning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;target.insertAdjacentElement(position, newEl)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;3 Golden Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Always &lt;strong&gt;create&lt;/strong&gt; the element first with &lt;code&gt;createElement()&lt;/code&gt;, then &lt;strong&gt;place&lt;/strong&gt; it with &lt;code&gt;appendChild()&lt;/code&gt; or &lt;code&gt;insertBefore()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Use &lt;code&gt;firstElementChild&lt;/code&gt; instead of &lt;code&gt;firstChild&lt;/code&gt; to avoid whitespace issues&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;insertBefore(newEl, ref)&lt;/code&gt; places the new element &lt;strong&gt;before&lt;/strong&gt; the reference — so to insert after item N, pass item N+1 as the reference&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplaceholder_dom_createelement.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplaceholder_dom_createelement.png" alt="JavaScript DOM createElement visual guide" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>Understanding JavaScript Callbacks: The "Don't Call Us, We'll Call You" Concept</title>
      <dc:creator>DHANRAJ S</dc:creator>
      <pubDate>Fri, 27 Feb 2026 15:45:33 +0000</pubDate>
      <link>https://dev.to/dhanraj_s_8fe1023a6e88992/understanding-javascript-callbacks-the-dont-call-us-well-call-you-concept-12im</link>
      <guid>https://dev.to/dhanraj_s_8fe1023a6e88992/understanding-javascript-callbacks-the-dont-call-us-well-call-you-concept-12im</guid>
      <description>&lt;p&gt;Imagine you are at a busy restaurant. You place your order, but instead of standing at the counter waiting for your food, the waiter gives you a &lt;strong&gt;buzzer&lt;/strong&gt;. You go sit down, chat with friends, or check your phone. When the food is ready, the buzzer goes off.&lt;/p&gt;

&lt;p&gt;In JavaScript, a &lt;strong&gt;Callback Function&lt;/strong&gt; is exactly like that buzzer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. What is a Callback Function?&lt;/strong&gt;&lt;br&gt;
In simple terms, a callback is a &lt;strong&gt;function passed as an argument&lt;/strong&gt; to another function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Why do we use it?&lt;/strong&gt;&lt;br&gt;
JavaScript usually runs code line-by-line. But some things (like loading a large image or fetching data) take time. Callbacks prevent the whole website from "freezing" while waiting for that task to finish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A Simple Example&lt;/strong&gt;&lt;br&gt;
Let’s look at a basic example where we pass a greeting function into another function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// The Callback Function
function sayGoodbye() {
    console.log("Goodbye! Task is finished.");
}

// The Main Function
function processUser(callback) {
    console.log("Processing user data...");
    // Simulating a task, then calling the callback
    callback(); 
}

// Passing sayGoodbye as an argument
processUser(sayGoodbye);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;output&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chef is cooking...&lt;/li&gt;
&lt;li&gt;Your food is ready&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What happened here?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;processUser&lt;/code&gt; starts running.&lt;/li&gt;
&lt;li&gt;It prints &lt;em&gt;"Processing user data..."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;It then executes &lt;code&gt;callback()&lt;/code&gt;, which is actually the &lt;code&gt;sayGoodbye&lt;/code&gt; function we passed in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;4. Practical Use: &lt;code&gt;setTimeout&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
The most common way beginners see callbacks is with timers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log("Start");

setTimeout(function() {
    console.log("This happens after 3 seconds!");
}, 3000);

console.log("End");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; "Start" is printed.&lt;/li&gt;
&lt;li&gt;    "End" is printed.&lt;/li&gt;
&lt;li&gt;    3 seconds later, the callback function inside setTimeout runs and prints "This happens after 3 seconds!"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here, the anonymous function inside is the callback. It waits for the 3-second "long task" to finish before running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. 3 Golden Rules&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A callback is just a function.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pass the name, don't call it:&lt;/strong&gt; Pass &lt;code&gt;myFunc&lt;/code&gt;, not &lt;code&gt;myFunc()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async Power:&lt;/strong&gt; They are the secret behind why websites can do many things at once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. summary&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25xoamdd55gw9qvetxte.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25xoamdd55gw9qvetxte.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>development</category>
    </item>
  </channel>
</rss>
