UnderstandJavaScript - Function, Context And Variable Environments

Variable Environment 

- Chỉ nơi mà các biến tồn tại và làm thế nào mà chúng liên quan đến nhau trong bộ nhớ.
Nó là câu trả lời cho câu hỏi " biến ở đâu ? " 
Cùng đến với một ví dụ : 
Cho đoạn code trên , chúng ta cùng tìm hiểu xem giá trị của biến myVar thay đổi như thế nào ?
Để trả lời câu hỏi đó chúng ta cần xem lại kiến thức về Execution Context , điều gì xảy ra khi các chức năng này được gọi.

Cho ví dụ sau :

Kết quả :




1 .Ban đầu khi chương trình chạy Javasript Engine sẽ tạo ra Global Execution Context và nó sẽ được tạo ra qua 2 giai đoạn Create Phase và Code Execution.
- Giai đoạn Create Phase thì biến và hàm được hosting lên lưu vào trong một vùng nhớ nào đó (không phải Variable Envỉonment)
- Giai đoạn Code Execution :Execution Context bị đẩy vào Execution Context Stack để thực thi , chương trình được thực thi theo từng dòng khi  Bên trong Global Execution Context có một nơi hay một vùng nhớ là Môi Trường Biến  (Variable Environtmet ) của nó chính là là Global Object (window trong browser) , hiểu đơn giản thì đây chính là nơi chứa biến và giá trị của nó.


2 : Trong giai đoạn Create Phase để tạo ra Global Execution Context thì nó chạy đến dòng 13 thì hàm a được invoke , thì JSE sẽ không tiếp tục chạy code ở execution này nữa (bị ngưng lại) , một Execution Context mới được tạo ra để bao bọc lấy code của hàm a
- Tiếp tục JSE lại tạo EC của hàm a qua 2 giai đoạn là Create Phase và Execution Code.
- Sau khi trải qua giai đoạn Create Phase trong giai đoạn Execution Code nó bị đẩy lên trên cùng của Execution Context Stack để thực thi , code lại tiếp tục được thực thi theo từng dòng , Variable Envỉonemt mới lại được tạo ra đểl lưu trữ các biến và giá trị của nó
=> Bạn chú ý rằng mỗi Varible Envỉonmen là độc lập và riêng biệt với nhau , các biến được lưu trong các Variable Envỉonment khác nhau thì không ảnh hưởng đến nhau. Suy ra một điều rằng các biến myVar ở trong các hàm a , b hay global chúng chẳng ảnh hưởng gì đến nhau.


3 : Tiếp tục trong giai đoạn Execution Code của EC hàm a thì hàm b được invoke , ngay lập tức giai đoạn này bị ngưng , một EC mới được tạo ra và lại trải qua 2 giai đoạn Create Phase và Execution Code , trong giai đoạn Execution Code thì EC này bị đẩy vào ECS , sau khi thực thi xong thì EC bị đẩy ra khỏi ECS.

4 : Bây giờ JSE lại tiếp tục thực thi code trong hàm a , sau khi chạy xong , EC lại bị đẩy ra khỏi ECS , JSE lại tiếp tục thực thi code ở trong Global Execution Context cho đến khi hết chương trình.



Nhận xét

Bài đăng phổ biến