JavaScript là ngôn ngữ đồng bộ [Chỉ chuyển sang dòng tiếp theo khi quá trình thực thi dòng hiện tại hoàn tất] và đơn luồng [Thực thi một lệnh tại một thời điểm theo một thứ tự cụ thể nối tiếp nhau]. Để biết đằng sau bối cảnh mã JavaScript được thực thi bên trong như thế nào, chúng ta phải biết một thứ gọi là Bối cảnh thực thi và vai trò của nó trong việc thực thi mã JavaScript
Bối cảnh thực hiện. Mọi thứ trong JavaScript được bao bọc bên trong Bối cảnh thực thi, đây là một khái niệm trừu tượng [có thể được coi là vùng chứa] chứa toàn bộ thông tin về môi trường mà mã JavaScript hiện tại đang được thực thi
Giờ đây, Bối cảnh thực thi có hai thành phần và mã JavaScript được thực thi theo hai giai đoạn
- Giai đoạn cấp phát bộ nhớ. Trong giai đoạn này, tất cả các hàm và biến của mã JavaScript được lưu trữ dưới dạng cặp khóa-giá trị bên trong thành phần bộ nhớ của ngữ cảnh thực thi. Trong trường hợp của một hàm, JavaScript đã sao chép toàn bộ hàm vào khối bộ nhớ nhưng trong trường hợp của các biến, nó gán không xác định làm trình giữ chỗ
- Giai đoạn thực thi mã. Trong giai đoạn này, mã JavaScript được thực thi từng dòng một bên trong Thành phần mã [còn được gọi là Chuỗi thực thi] của Bối cảnh thực thi.
Hãy xem toàn bộ quá trình thông qua một ví dụ
Javascript
var
number = 2;
function
Square [n] {
var
res = n * n;
return
res;
number = 2;
0
var
number = 2;
2
Trong mã JavaScript ở trên, có hai biến có tên là số và số mới và một hàm có tên là Hình vuông đang trả về bình phương của số. Vì vậy, khi chúng tôi chạy chương trình này, Bối cảnh thực thi toàn cầu được tạo
Vì vậy, trong giai đoạn Cấp phát bộ nhớ, bộ nhớ sẽ được cấp phát cho các biến và hàm như thế này
Bối cảnh thực thi toàn cầu
Trong Giai đoạn thực thi mã, JavaScript là một ngôn ngữ luồng đơn lại chạy qua từng dòng mã và cập nhật các giá trị của hàm và biến được lưu trữ trong Giai đoạn cấp phát bộ nhớ trong Thành phần bộ nhớ
Vì vậy, trong giai đoạn thực thi mã, bất cứ khi nào một hàm mới được gọi, Bối cảnh thực thi mới sẽ được tạo. Vì vậy, mỗi khi một hàm được gọi trong Thành phần mã, một Bối cảnh thực thi mới được tạo bên trong bối cảnh thực thi chung trước đó.
Bối cảnh thực thi toàn cầu
Vì vậy, một lần nữa, trước khi hoàn thành cấp phát bộ nhớ trong Thành phần bộ nhớ của Bối cảnh thực thi mới. Sau đó, trong Giai đoạn thực thi mã của Bối cảnh thực thi mới được tạo, Bối cảnh thực thi chung sẽ giống như sau
Bối cảnh thực thi toàn cầu
Như chúng ta có thể thấy, các giá trị được gán trong thành phần bộ nhớ sau khi thực thi từng dòng mã, i. e. con số. 2, độ phân giải. 4, số mới. 4
Sau câu lệnh trả về của hàm được gọi, giá trị trả về được gán thay cho giá trị không xác định trong phân bổ bộ nhớ của ngữ cảnh thực thi trước đó. Sau khi trả về giá trị, ngữ cảnh thực thi mới [tạm thời] sẽ bị xóa hoàn toàn. Bất cứ khi nào quá trình thực thi gặp câu lệnh return, Nó sẽ đưa điều khiển trở lại ngữ cảnh thực thi nơi hàm được gọi
Bối cảnh thực thi toàn cầu
Sau khi thực hiện lời gọi hàm đầu tiên khi chúng ta gọi lại hàm, JavaScript sẽ tạo lại một bối cảnh tạm thời khác trong đó quy trình tương tự lặp lại tương ứng [thực thi bộ nhớ và thực thi mã]. Cuối cùng, bối cảnh thực thi toàn cầu bị xóa giống như bối cảnh thực thi con. Toàn bộ bối cảnh thực thi cho phiên bản của chức năng đó sẽ bị xóa
ngăn xếp cuộc gọi. Khi một chương trình bắt đầu thực thi, JavaScript sẽ đẩy toàn bộ chương trình dưới dạng ngữ cảnh chung vào một ngăn xếp được gọi là Ngăn xếp cuộc gọi và tiếp tục thực thi. Bất cứ khi nào JavaScript thực thi một bối cảnh mới và chỉ làm theo quy trình tương tự và đẩy vào ngăn xếp. Khi ngữ cảnh kết thúc, JavaScript sẽ bật lên trên cùng của ngăn xếp tương ứng
ngăn xếp cuộc gọi
Khi JavaScript hoàn thành việc thực thi toàn bộ mã, Bối cảnh thực thi toàn cầu sẽ bị xóa và bật ra khỏi Ngăn xếp cuộc gọi làm cho ngăn xếp Cuộc gọi trống