پشت صحنه اجرای JavaScript در مرورگر؛ از کد تا اجرای برنامه

Behind the Scenes of JavaScript Execution in the Browser پشت صحنه اجرای JavaScript در مرورگر؛ از کد تا اجرای برنامه

Behind the Scenes of JavaScript Execution in the Browser: From Code to Execution

Author: Just Programmer

Category: JavaScript | Web Development

Introduction

Have you ever wondered what actually happens behind the scenes when JavaScript code runs in a web browser?

When you click a button, open a menu, fetch data from a server, or update a webpage without reloading it, several processes are working together inside the browser.

JavaScript is more than a collection of instructions. It interacts with the JavaScript engine, the page structure, and browser capabilities to make websites dynamic and interactive.

In this article from Just Programmer, we will explore how JavaScript runs in the browser, what a JavaScript engine does, how the DOM is updated, and how the Event Loop helps manage asynchronous operations.


1. What Is JavaScript and Why Is It Used in Browsers?

JavaScript is a high-level, dynamic programming language widely used in web development. It allows developers to turn static HTML and CSS pages into interactive and dynamic experiences.

With JavaScript, developers can:

  • Change webpage content.

  • Respond to user events such as clicks and keyboard input.

  • Validate forms.

  • Fetch data from servers.

  • Control animations and user interface interactions.

  • Store data in the browser.

However, a browser does not execute JavaScript source code as plain text. The code is processed by a JavaScript engine, which is responsible for executing JavaScript instructions.


2. What Happens When JavaScript Code Runs?

Consider the following JavaScript code:

const message = "Hello, World!";

console.log(message);

When the browser encounters this code, the JavaScript engine processes it so that the instructions can be executed.

The overall process can be simplified as:

JavaScript Code → JavaScript Engine → Execution

The engine processes the source code and executes its instructions. Modern JavaScript engines use techniques such as interpretation and Just-In-Time (JIT) compilation to improve execution performance.

The exact internal steps depend on the engine, its version, and the code being executed.


3. What Is a JavaScript Engine?

A JavaScript engine is software that processes and executes JavaScript code. Different browsers use different JavaScript engines.

Some well-known engines include:

  • V8: Used by Google Chrome and Node.js.

  • SpiderMonkey: Used by Firefox.

  • JavaScriptCore: Used by Safari.

How Does the V8 Engine Work?

V8 receives JavaScript code and processes it through several stages of execution and optimization. It uses techniques such as Just-In-Time compilation to improve the performance of suitable code.

In simple terms, the JavaScript engine executes the language, while browser features such as DOM access, network requests, and timers are provided through browser APIs.


4. The Role of the DOM in JavaScript Execution

DOM stands for Document Object Model. It represents the structure of an HTML document as an object-based model that JavaScript can access and modify.

When a browser processes HTML, it creates a structure representing the elements on the page. JavaScript can use the DOM to find elements, change their content, and create new elements.

Consider the following HTML:

<h1 id="title">Hello</h1>

<button id="btn">Change Text</button>

We can change the heading using JavaScript:

const title = document.getElementById("title");
const btn = document.getElementById("btn");

btn.addEventListener("click", () => {
    title.textContent = "Hello JavaScript!";
});

In this example, JavaScript accesses the heading through the DOM and updates its text when the user clicks the button.

DOM changes usually affect the document represented in the browser rather than modifying the original HTML file stored on the server.


5. What Is the Call Stack?

The Call Stack is a structure used by the JavaScript engine to manage function execution.

In its main execution context, JavaScript generally processes synchronous code in order. When a function is called, an execution frame is placed on the Call Stack. Once the function finishes, its frame is removed.

Example:

function first() {
    second();
}

function second() {
    console.log("Hello");
}

first();

The general execution order is:

  1. The first() function is called.

  2. first() calls second().

  3. second() prints a message to the console.

  4. The functions finish, and the Call Stack becomes empty.

Understanding the Call Stack is important for analyzing JavaScript execution and understanding the Event Loop.


6. The Event Loop and Asynchronous Code

JavaScript uses a single-threaded model for its main execution context. However, browsers provide capabilities for handling asynchronous operations.

For example, fetching data from a server or using setTimeout may involve waiting. If every operation blocked the main execution path, webpage responsiveness could be affected.

The Event Loop helps coordinate the execution of tasks that become ready through the relevant queues and execution mechanisms.

Example:

console.log("1");

setTimeout(() => {
    console.log("2");
}, 0);

console.log("3");

Typical output:

1
3
2

Why?

First, console.log("1") runs. The timer is then registered, and execution continues. Next, console.log("3") runs.

The setTimeout callback does not execute immediately. It becomes eligible for execution after the required conditions are met and the Event Loop processes it.

A delay of zero in setTimeout does not guarantee immediate execution.


7. Synchronous vs. Asynchronous Code

Synchronous Code

Synchronous code generally executes in sequence, with the current execution path continuing through each operation.

console.log("Start");
console.log("Middle");
console.log("End");

Output:

Start
Middle
End

Asynchronous Code

Asynchronous operations allow certain tasks to be handled outside the immediate sequence of synchronous execution. This helps JavaScript work with operations such as network requests and timers.

Example using a Promise:

console.log("Start");

Promise.resolve().then(() => {
    console.log("Promise");
});

console.log("End");

Output:

Start
End
Promise

The Promise callback is placed in the Microtask queue and is processed after the current synchronous execution finishes, according to the event loop's scheduling rules.


8. What Are Browser APIs?

Browser APIs are interfaces provided by the browser that allow JavaScript to interact with different browser capabilities.

The JavaScript engine itself does not provide every browser feature. The browser environment exposes APIs for tasks such as accessing the DOM, making network requests, working with timers, and storing data.

Examples of Browser APIs include:

  • DOM API: Working with webpage elements.

  • Fetch API: Sending and receiving network requests.

  • Timers: Using setTimeout and setInterval.

  • Web Storage API: Using localStorage and sessionStorage.

  • Geolocation API: Accessing location information with the required user permission.

Example using the Fetch API:

fetch("https://jsonplaceholder.typicode.com/posts/1")
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

In this example, the Fetch API starts a network request. After the response is received and converted into JSON, the data is displayed in the console.

The operation is handled through browser capabilities and Promise-based asynchronous processing.


9. How Does JavaScript Make Webpages Interactive?

The combination of JavaScript, the DOM, and Browser APIs allows webpages to respond to user interactions.

For example, consider a registration form:

  1. The user enters their information.

  2. JavaScript receives the form submission event.

  3. The input is validated.

  4. A request may be sent to the server.

  5. The server response is received.

  6. The result is displayed on the page.

This process can be implemented without reloading the entire webpage. The exact behavior depends on the application architecture and request implementation.

JavaScript acts as a connection between user interaction, the page structure, and browser capabilities.


10. Is JavaScript Really Single-Threaded?

JavaScript's main execution context in a browser generally uses a single Call Stack, and its primary execution model is single-threaded. However, the browser environment is broader than the JavaScript engine and provides mechanisms for handling work outside the main execution path.

For example, certain browser operations can be handled without directly blocking the main JavaScript execution path. Once results become available, related callbacks or tasks are processed through the relevant queues and scheduling mechanisms.

Browsers also support features such as Web Workers, which allow JavaScript to run in separate execution contexts.

Therefore, it is important to distinguish between JavaScript's main execution model and the broader browser capabilities that support additional forms of concurrency.


11. Conclusion

JavaScript execution in the browser is the result of several components working together. The JavaScript engine processes and executes code, the DOM represents the structure of the webpage, and Browser APIs provide capabilities such as network requests and timers.

The Event Loop also plays an important role in coordinating asynchronous execution and tasks that become ready for processing.

If you are interested in frontend development, understanding these concepts can help you write JavaScript more effectively, analyze program behavior, and troubleshoot execution and performance issues.

JavaScript is more than writing a few lines of code. Understanding how it runs is an important step toward becoming a more knowledgeable and capable web developer.


Frequently Asked Questions (FAQ)

Does the browser execute JavaScript directly?

JavaScript code is processed and executed by a JavaScript engine within the browser. The browser also provides APIs that allow JavaScript to interact with the webpage and its environment.

What is the difference between a JavaScript engine and a browser?

A JavaScript engine processes and executes JavaScript code. A browser includes a JavaScript engine along with capabilities such as page rendering, the DOM, networking, and other Browser APIs.

What does the Event Loop do?

The Event Loop helps coordinate the execution of ready tasks with the Call Stack and relevant queues. It is an important part of asynchronous JavaScript execution.

Is learning the DOM important for frontend development?

Understanding the DOM is highly useful for working with webpages and creating interactions with HTML elements. Many frontend libraries and frameworks also work with page structures and interface updates in different ways.


© Just Programmer | Learn • Build • Grow

پشت صحنه اجرای JavaScript در مرورگر؛ از کد تا اجرای برنامه

نویسنده: Just Programmer

دسته‌بندی: JavaScript | Web Development


مقدمه

تا به حال فکر کرده‌اید وقتی یک کد JavaScript را در مرورگر اجرا می‌کنیم، دقیقاً چه اتفاقی در پشت صحنه رخ می‌دهد؟

وقتی روی یک دکمه کلیک می‌کنیم، یک منو باز می‌شود، اطلاعات از سرور دریافت می‌کنیم یا محتوای یک صفحه بدون بارگذاری مجدد تغییر می‌کند، مجموعه‌ای از فرایندها در مرورگر در حال انجام است.

JavaScript فقط مجموعه‌ای از دستورات نیست؛ بلکه با موتور اجرای خود، ساختار صفحه و امکانات مرورگر ارتباط برقرار می‌کند تا صفحات وب تعاملی و پویا شوند.

در این مقاله از Just Programmer، مرحله‌به‌مرحله بررسی می‌کنیم که JavaScript چگونه اجرا می‌شود، موتور JavaScript چه نقشی دارد، DOM چگونه تغییر می‌کند و Event Loop چطور به مدیریت کارهای ناهمگام کمک می‌کند.


۱. JavaScript چیست و چرا در مرورگر استفاده می‌شود؟

JavaScript یک زبان برنامه‌نویسی سطح بالا و پویاست که در توسعه وب کاربرد گسترده‌ای دارد. این زبان به توسعه‌دهندگان اجازه می‌دهد صفحات HTML و CSS را از حالت ایستا خارج کنند و قابلیت‌های تعاملی به آن‌ها اضافه کنند.

با JavaScript می‌توانیم:

  • محتوای یک صفحه را تغییر دهیم.

  • به رویدادهای کاربر مانند کلیک و تایپ پاسخ دهیم.

  • فرم‌ها را بررسی کنیم.

  • اطلاعات را از سرور دریافت کنیم.

  • انیمیشن‌ها و تعاملات رابط کاربری را کنترل کنیم.

  • داده‌ها را در مرورگر ذخیره کنیم.

اما مرورگر کد JavaScript را مستقیماً مانند یک فایل متنی اجرا نمی‌کند. کد به JavaScript Engine داده می‌شود؛ موتوری که وظیفه پردازش و اجرای کد را بر عهده دارد.


۲. وقتی کد JavaScript اجرا می‌شود چه اتفاقی می‌افتد؟

فرض کنید کد زیر را در یک صفحه HTML قرار داده‌ایم:

const message = "Hello, World!";

console.log(message);

هنگامی که مرورگر به این کد می‌رسد، موتور JavaScript آن را پردازش می‌کند تا دستورات قابل اجرا شوند.

فرایند کلی را می‌توان به شکل زیر در نظر گرفت:

JavaScript Code → JavaScript Engine → Execution

در این فرایند، موتور کد منبع را پردازش می‌کند و دستورات آن را اجرا می‌کند. موتورهای مدرن JavaScript از روش‌هایی مانند تفسیر و کامپایل در زمان اجرا (JIT) استفاده می‌کنند تا عملکرد کد بهبود پیدا کند.

نکته مهم این است که جزئیات داخلی اجرای کد در موتورهای مختلف و نسخه‌های متفاوت ممکن است فرق داشته باشد.


۳. JavaScript Engine چیست؟

JavaScript Engine نرم‌افزاری است که کد JavaScript را پردازش و اجرا می‌کند. هر مرورگر از یک موتور JavaScript برای اجرای کدهای این زبان استفاده می‌کند.

چند نمونه از موتورهای معروف JavaScript عبارت‌اند از:

  • V8: موتور مورد استفاده در Google Chrome و Node.js.

  • SpiderMonkey: موتور JavaScript مورد استفاده در Firefox.

  • JavaScriptCore: موتور مورد استفاده در Safari.

موتور V8 چگونه کار می‌کند؟

V8 کد JavaScript را دریافت می‌کند و با استفاده از مراحل مختلف پردازش و بهینه‌سازی، آن را اجرا می‌کند. این موتور از تکنیک‌هایی مانند Just-In-Time Compilation استفاده می‌کند تا کدهای قابل بهینه‌سازی را با عملکرد مناسبی اجرا کند.

به زبان ساده، موتور JavaScript مانند بخش اجرایی زبان عمل می‌کند؛ اما امکاناتی مانند دسترسی به DOM، دریافت درخواست‌های شبکه و زمان‌سنج‌ها در محیط مرورگر از طریق Browser APIs فراهم می‌شوند.


۴. نقش DOM در اجرای JavaScript

DOM مخفف Document Object Model است و ساختار یک صفحه HTML را به‌صورت یک مدل شیء‌محور در اختیار JavaScript قرار می‌دهد.

مرورگر هنگام پردازش HTML، ساختاری از عناصر صفحه ایجاد می‌کند. JavaScript می‌تواند از طریق DOM این عناصر را پیدا کند، تغییر دهد یا عناصر جدیدی ایجاد کند.

برای مثال، HTML زیر را در نظر بگیرید:

<h1 id="title">Hello</h1>

<button id="btn">Change Text</button>

حالا می‌توانیم با JavaScript متن عنوان را تغییر دهیم:

const title = document.getElementById("title");
const btn = document.getElementById("btn");

btn.addEventListener("click", () => {
    title.textContent = "Hello JavaScript!";
});

در این مثال، JavaScript با استفاده از DOM به عنصر عنوان دسترسی پیدا می‌کند و پس از کلیک کاربر، متن آن را تغییر می‌دهد.

نکته: تغییر DOM لزوماً به معنای تغییر مستقیم فایل HTML روی سرور نیست. این تغییر معمولاً در ساختار صفحه‌ای که در حافظه مرورگر قرار دارد انجام می‌شود.


۵. Call Stack چیست؟

Call Stack ساختاری است که موتور JavaScript از آن برای مدیریت اجرای توابع استفاده می‌کند.

JavaScript در محیط اصلی اجرای خود معمولاً کدهای هم‌زمان را به‌صورت ترتیبی پردازش می‌کند. وقتی یک تابع فراخوانی می‌شود، یک رکورد اجرایی در Call Stack قرار می‌گیرد و پس از پایان اجرای تابع، از آن خارج می‌شود.

مثال:

function first() {
    second();
}

function second() {
    console.log("Hello");
}

first();

ترتیب کلی اجرا به این شکل است:

  1. تابع first() فراخوانی می‌شود.

  2. تابع first() تابع second() را اجرا می‌کند.

  3. تابع second() پیام را در کنسول نمایش می‌دهد.

  4. اجرای توابع به پایان می‌رسد و Call Stack خالی می‌شود.

درک Call Stack برای فهم خطاهای اجرای JavaScript و نحوه کار Event Loop اهمیت زیادی دارد.


۶. Event Loop و کدهای ناهمگام

JavaScript در اجرای اصلی خود از یک مدل تک‌رشته‌ای استفاده می‌کند؛ بااین‌حال، مرورگر امکاناتی برای مدیریت عملیات ناهمگام در اختیار آن قرار می‌دهد.

برای مثال، دریافت اطلاعات از یک سرور یا استفاده از setTimeout ممکن است نیازمند انتظار باشد. اگر همه این عملیات به شکل مسدودکننده در مسیر اجرای اصلی انجام شوند، تعامل با صفحه می‌تواند تحت تأثیر قرار بگیرد.

Event Loop به هماهنگی اجرای کدهای آماده‌شده و وظایف مختلف کمک می‌کند.

مثال:

console.log("1");

setTimeout(() => {
    console.log("2");
}, 0);

console.log("3");

خروجی معمول این کد:

1
3
2

چرا؟

ابتدا console.log("1") اجرا می‌شود. سپس زمان‌سنج ثبت می‌شود و اجرای برنامه ادامه پیدا می‌کند. بعد از آن، console.log("3") اجرا می‌شود.

تابع مربوط به setTimeout بلافاصله در همان لحظه اجرا نمی‌شود؛ پس از فراهم شدن شرایط و زمانی که Event Loop آن را برای اجرا انتخاب کند، callback اجرا خواهد شد.

عدد صفر در setTimeout به معنای اجرای تضمینی و فوری نیست.


۷. تفاوت کد Synchronous و Asynchronous

کد Synchronous

در کد هم‌زمان، دستورات به ترتیب اجرا می‌شوند و اجرای مسیر فعلی تا انجام عملیات مربوطه ادامه پیدا می‌کند.

console.log("Start");
console.log("Middle");
console.log("End");

خروجی:

Start
Middle
End

کد Asynchronous

در کد ناهمگام، برخی عملیات می‌توانند برای اجرا در زمان مناسب به محیط اجرای برنامه سپرده شوند. این موضوع به JavaScript اجازه می‌دهد در کنار مدیریت عملیات مختلف، پاسخ‌گویی به تعاملات کاربر را بهتر حفظ کند.

مثال با Promise:

console.log("Start");

Promise.resolve().then(() => {
    console.log("Promise");
});

console.log("End");

خروجی:

Start
End
Promise

در این مثال، callback مربوط به Promise در صف Microtask قرار می‌گیرد و پس از پایان اجرای کد هم‌زمان فعلی، پردازش می‌شود.


۸. Browser APIs چیستند؟

Browser APIs مجموعه‌ای از رابط‌هایی هستند که مرورگر برای انجام کارهای مختلف در اختیار JavaScript قرار می‌دهد.

JavaScript Engine به‌تنهایی تمام امکانات مرورگر را فراهم نمی‌کند. محیط مرورگر APIهایی برای کارهایی مانند دسترسی به DOM، درخواست شبکه، زمان‌سنج‌ها و ذخیره‌سازی در اختیار برنامه قرار می‌دهد.

چند نمونه از Browser APIs:

  • DOM API: کار با عناصر صفحه.

  • Fetch API: ارسال و دریافت درخواست‌های شبکه.

  • Timers: استفاده از setTimeout و setInterval.

  • Web Storage API: استفاده از localStorage و sessionStorage.

  • Geolocation API: دسترسی به موقعیت مکانی، با اجازه کاربر و در شرایط لازم.

مثال ساده از Fetch API:

fetch("https://jsonplaceholder.typicode.com/posts/1")
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

در این کد، درخواست شبکه با Fetch API آغاز می‌شود. پس از دریافت پاسخ و تبدیل آن به JSON، اطلاعات در کنسول نمایش داده می‌شوند.

مدیریت این عملیات با استفاده از امکانات مرورگر و سازوکارهای Promise انجام می‌شود.


۹. JavaScript چگونه صفحه را تعاملی می‌کند؟

ترکیب JavaScript، DOM و Browser APIs باعث می‌شود صفحه وب بتواند به رویدادهای مختلف واکنش نشان دهد.

برای مثال، در یک فرم ثبت‌نام:

  1. کاربر اطلاعات خود را وارد می‌کند.

  2. JavaScript رویداد ارسال فرم را دریافت می‌کند.

  3. اطلاعات ورودی بررسی می‌شوند.

  4. در صورت نیاز، درخواست به سرور ارسال می‌شود.

  5. پاسخ سرور دریافت می‌شود.

  6. نتیجه در صفحه نمایش داده می‌شود.

این فرایند می‌تواند بدون بارگذاری کامل صفحه انجام شود؛ البته نحوه پیاده‌سازی به ساختار برنامه و نوع درخواست بستگی دارد.

JavaScript در اینجا نقش رابط بین تعامل کاربر، ساختار صفحه و امکانات مرورگر را ایفا می‌کند.


۱۰. آیا JavaScript واقعاً تک‌رشته‌ای است؟

JavaScript در اجرای اصلی کد در مرورگر معمولاً از یک Call Stack استفاده می‌کند و اجرای اصلی آن تک‌رشته‌ای است. بااین‌حال، مرورگر محیطی گسترده‌تر از خود موتور JavaScript دارد و امکاناتی برای انجام کارهای خارج از مسیر اجرای اصلی فراهم می‌کند.

برای نمونه، برخی عملیات مرورگر می‌توانند بدون اجرای مستقیم و مسدودکننده در Call Stack اصلی انجام شوند. پس از آماده شدن نتیجه، کار مربوطه طبق سازوکار صف‌ها و Event Loop به مسیر اجرای JavaScript تحویل داده می‌شود.

همچنین مرورگرها از قابلیت‌هایی مانند Web Workers پشتیبانی می‌کنند که امکان اجرای JavaScript در زمینه‌های جداگانه را فراهم می‌کنند.

بنابراین، بهتر است بین «مدل اجرای اصلی JavaScript» و «قابلیت‌های چندرشته‌ای و داخلی محیط مرورگر» تفاوت قائل شویم.


۱۱. جمع‌بندی

اجرای JavaScript در مرورگر نتیجه همکاری چند بخش مختلف است. موتور JavaScript کد را پردازش و اجرا می‌کند، DOM ساختار صفحه را در اختیار برنامه قرار می‌دهد و Browser APIs امکاناتی مانند درخواست‌های شبکه و زمان‌سنج‌ها را فراهم می‌کنند.

Event Loop نیز به مدیریت اجرای وظایف آماده‌شده و هماهنگی عملیات ناهمگام کمک می‌کند.

اگر به توسعه Frontend علاقه دارید، درک این مفاهیم به شما کمک می‌کند کدهای JavaScript را آگاهانه‌تر بنویسید، رفتار برنامه را بهتر تحلیل کنید و مشکلات مربوط به اجرای کد و عملکرد صفحه را راحت‌تر بررسی کنید.

JavaScript فقط نوشتن چند خط کد نیست؛ شناخت نحوه اجرای آن، مسیر شما را به سمت توسعه‌دهنده‌ای آگاه‌تر و توانمندتر هموار می‌کند.


سوالات متداول | FAQ

آیا JavaScript مستقیماً توسط مرورگر اجرا می‌شود؟

کد JavaScript توسط موتور JavaScript موجود در محیط مرورگر پردازش و اجرا می‌شود. مرورگر همچنین امکانات و APIهای مختلفی برای تعامل کد با صفحه و محیط خود فراهم می‌کند.

تفاوت JavaScript Engine و Browser چیست؟

JavaScript Engine وظیفه پردازش و اجرای کد JavaScript را دارد. مرورگر علاوه بر موتور JavaScript، امکاناتی مانند نمایش صفحه، DOM، شبکه و سایر Browser APIs را نیز فراهم می‌کند.

Event Loop چه کاری انجام می‌دهد؟

Event Loop به هماهنگی اجرای کدهای آماده‌شده با Call Stack و صف‌های مربوط به وظایف کمک می‌کند و در مدل اجرای ناهمگام JavaScript نقش مهمی دارد.

آیا یادگیری DOM برای توسعه Frontend ضروری است؟

شناخت DOM برای کار با صفحات وب و ایجاد تعاملات مستقیم با عناصر HTML بسیار مفید است. بسیاری از کتابخانه‌ها و فریم‌ورک‌های Frontend نیز در نهایت با مدل‌های مختلفی از ساختار صفحه و به‌روزرسانی رابط کاربری سروکار دارند.


© Just Programmer | Learn • Build • Grow

Back to Articles