- vừa được xem lúc

Call Stack và Execution Context trong JavaScript

0 0 5

Người đăng: Thavrith

Theo Viblo Asia

Execution Context

Execution context là nơi mà JavaScript code được thực thi. Mỗi lần ta gọi một function thì sẽ có một function execution context được tạo ra cho function đó và code của function đó sẽ được thực thi bên trong function execution context đó. Code của global thì sẽ được thực thi trong global execution context - được khởi tạo khi chương trình JavaScript được chạy.

Execution context gồm có 2 phần:

  • Thread of execution: Đi qua từng dòng code và thực thi từng dòng.
  • Memory: Lưu dữ liệu (variables) và code (function) để sử dụng.

Call Stack

Call stack giúp theo dõi chúng ta đang ở execution context nào - nghĩa là function nào đang được thực thi. Và giúp ta xác định sau khi hoàn thành function đó thì sẽ trở về nơi nào để tiếp tục thực thi. Nó hoạt động theo cơ chế LIFO (last in first out).

Ví dụ

Chương trình của chúng ta như sau:

Khi chúng ta run đoạn code ở trên, một global execution context sẽ được tạo ra kèm global memory, call stack lúc này thì chúng ta đang ở global()

Tiếp theo đó, thread of execution đi qua từng dòng code và thực thi lần lượt như sau:

  • Dòng code 1: Ta khai báo một constant num ở global memory và gán giá trị cho nó là 3.
  • Dòng code 3: Chúng ta khai báo function multiplyBy2 ở global memory.
  • Dòng code 8: Chúng ta khai báo một constant output và giá trị của nó lúc này chưa xác định, tại sao? Tại vì bên phải của nó là multiplyBy2(num), chúng ta giải quyết bằng cách gọi function multiplyBy2 và truyền vào argument num: 3.

Như ta đã tìm hiểu, mỗi khi một function được gọi thì sẽ có một function execution context tương ứng được tạo ra. Call stack cũng sẽ làm nhiệm vụ của nó là theo dõi xem chương trình chúng ta đang ở execution context nào.

Toàn cảnh lúc này:

Lúc này chúng ta đang ở function execution context của multiplyBy2(3), và thread of execution lại tiếp tục:

  • Điều đầu nó thực thi là gán giá trị cho parameter inputNumber: 3
  • Tiếp theo nó thực thi dòng code đầu tiên của function multiplyBy2: khai báo constant result và gán giá trị cho nó là inputNumber * 2: 6
  • Tiếp theo với dòng code return result;:
    1. JavaScript sẽ đi đến local memory và tìm giá trị của result: 6,
    2. Lấy giá trị đó return (trả về) cho constant outputglobal memory.

Vậy là đã hoàn thành dòng code thứ 8, function execution context ở trên sẽ được cleared, call stack lúc này sẽ đẩy multiplyBy2(3) ra khỏi stack và trở lại global().

  • Tiếp tục thực thi Dòng code 9: const newOutput = multiplyBy2(10);, tương tự khi thực thi dòng code 8:
    • multiplyBy2(10) sẽ được đẩy vào call stack
    • Một function execution context tương ứng được tạo
    • Thực thi từng dòng, và trả giá trị đã tính toán được cho newOutputglobal memory

Toàn cảnh lúc này:

Vậy là đã hoàn thành dòng code thứ 9, function execution context ở trên sẽ được cleared, call stack lúc này sẽ đẩy multiplyBy2(10) ra khỏi stack và trở lại global().

Vì chương trình đã hoàn thành nên global execution context cũng sẽ được cleared luôn.

Kết bài

Vậy là chúng ta đã cùng nhau tìm hiểu về execution context và call stack.

Cảm ơn mọi người đã đọc, em/mình đang học JavaScript và viết bài này, mong nhận được góp ý của mọi người để hoàn chỉnh bài viết cũng như để lại tài liệu cho những người mới học khác.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 500

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 136

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 117

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 93

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 229