Part 06 · Functions · 6.1.05

Call semantics, this, iterables và memory reachability

this phụ thuộc call form trừ arrow lexical capture; garbage collector giữ object còn reachable—not “biến hết scope là xóa”.

Debug rule: xác định call site, function identity và reference path đang giữ object trước khi sửa bằng bind, WeakRef hoặc manual cleanup.

1. Call forms và this

Call formthisLưu ý
obj.m()Receiver objTách const f=obj.m làm mất receiver
Plain strict callundefinedKhông dựa vào global fallback
call/apply/bindExplicitbind tạo function identity mới
new C()Instance đang khởi tạoArrow không constructible
ArrowLexical captureKhông có own this/arguments/new.target

2. Parameters, callbacks và identity

Default/rest/destructuring chạy khi call và có scope semantics riêng. Function object mang closure. Callback tách method có thể mất receiver; bind hoặc arrow wrapper sửa receiver nhưng tạo identity mới, nên unsubscribe/removeEventListener phải giữ đúng reference.

const handler = service.handle.bind(service);
target.addEventListener("event", handler);
target.removeEventListener("event", handler); // same identity

3. Iterable, iterator và generator

Iterable cung cấp Symbol.iterator; iterator trả next() với value/done. Generator tạo stateful iterator và cleanup qua return()/finally. Async iterable là pull-based async protocol, hữu ích để phối hợp backpressure thay vì buffer vô hạn.

4. Reachability và memory leaks

GC giữ object reachable qua globals, closures, listeners, timers, caches và detached DOM. WeakMap phù hợp metadata gắn với object key mà không giữ key sống; WeakRef/finalization có timing không đảm bảo và không thay deterministic cleanup. Bound cache, unsubscribe/abort và profile heap thay vì gọi GC thủ công.

Evidence: chụp heap snapshots trước/sau workload, so retained path/dominator, xác nhận listener/timer/cache giảm sau cleanup và theo dõi memory qua nhiều GC cycles.
Tài liệu: MDN this · MDN Memory Management · MDN Iteration Protocols