Lesson 10 — Hàm & Closures
Ba công cụ tương tác chạy trên một interpreter JS thật có hàm/closure: (1) Call stack visualizer cho đệ quy phình/xẹp, (2) Closure explorer xem hàm "nhớ" biến, (3) Closure loop bug minh họa lỗi bắt biến lặp.
1. Call Stack Visualizer — đệ quy phình rồi xẹp
Chọn hàm đệ quy, nhập n, rồi "Chạy từng bước" để xem mỗi lời gọi push một frame, mỗi return pop và lan giá trị ngược lên.
sẵn sàng
Call stack (đỉnh ở trên)
stack rỗng — bấm "Bước tiếp"
Nhật ký push / pop
(chưa chạy)
2. Closure Explorer — hàm "nhớ" biến
makeAdder(x) trả về một hàm con bắt giữ x. Tạo vài adder với x khác nhau, rồi gọi chúng để thấy mỗi closure tra x từ environment captured của riêng nó.
fn makeAdder(x) {
fn inner(n) { return n + x; } // x là biến tự do, bắt từ makeAdder
return inner;
}
3. Closure Loop Bug — bắt biến, không bắt giá trị
Vòng lặp tạo nhiều closure. Nếu cả vòng dùng một biến lặp chung (bug), mọi closure trỏ cùng ô nhớ → in cùng giá trị cuối. Bật/tắt để so sánh với bản đã sửa (biến mới mỗi vòng).
Kết quả khi gọi từng closure: