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”.
bind, WeakRef hoặc manual cleanup.1. Call forms và this
| Call form | this | Lưu ý |
|---|---|---|
obj.m() | Receiver obj | Tách const f=obj.m làm mất receiver |
| Plain strict call | undefined | Không dựa vào global fallback |
call/apply/bind | Explicit | bind tạo function identity mới |
new C() | Instance đang khởi tạo | Arrow không constructible |
| Arrow | Lexical capture | Khô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.
- Consumer dừng sớm nên iterator cleanup resource.
- Generator giữ state/closure tới khi hoàn tất hoặc bị release.
- Async iterator vẫn cần AbortSignal/deadline cho I/O bị treo.
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.