Execution context và call stack: đọc được stack trace là kỹ năng debug nền tảng

Mỗi khi một hàm JavaScript chạy, engine tạo ra một execution context cho lần gọi đó — một khung chứa thông tin về scope, giá trị this, và các biến local. Các context này được xếp chồng lên nhau trong call stack. Hiểu rõ cơ chế xếp chồng này không phải kiến thức hàn lâm: nó là thứ quyết định bạn đọc được một stack trace dài 40 dòng trong vài giây hay ngồi đoán mò, và là lý do Maximum call stack size exceeded xuất hiện đúng lúc traffic tăng.

Stack hoạt động thế nào

Khi script bắt đầu, engine push một global execution context. Mỗi lần gọi hàm push thêm một context lên đỉnh stack; khi hàm return, context đó được pop ra. Stack chạy theo LIFO, và đỉnh stack luôn là hàm đang thực thi.

function loadUser(id) {