JS Core Engine
JS Core Engine
Phần tiêu đề “JS Core Engine”Thời gian: 4 buổi × 90 phút = 6 giờ
Output: CodePen collection + Excalidraw diagram + Note Obsidian
Vấn đề
Phần tiêu đề “Vấn đề”Code JS đôi khi chạy không như bạn nghĩ. Tại sao this đổi giá trị? Tại sao instanceof đôi khi “lừa dối”? Tại sao class syntax là “syntactic sugar”? Senior phải debug được code JS legacy và giải thích cho junior hiểu.
Bảng quyết định
Phần tiêu đề “Bảng quyết định”| Khái niệm | Khi nào cần hiểu sâu | Khi nào KHÔNG cần |
|---|---|---|
| Execution Context | Luôn — để hiểu hoisting, scope, closure | Không bao giờ “không cần” |
this binding |
Debug legacy code, interview, viết framework | Dùng arrow + Hooks thì ít gặp trực tiếp |
| Prototype chain | Đọc code cũ (pre-ES6), hiểu instanceof |
Code modern ít dùng trực tiếp |
| Proxy | Validation, reactive state, logging — advanced | 90% app không cần tự viết Proxy |
Class modern (#private, static) |
OOP trong TS/JS, design patterns | Functional programming purist |
Quyết định mặc định
Phần tiêu đề “Quyết định mặc định”Hiểu Execution Context và this để debug. Hiểu Prototype để đọc legacy. Dùng Class modern khi cần OOP rõ ràng. Proxy chỉ khi cần intercept behavior.
Anti-pattern
Phần tiêu đề “Anti-pattern”- Dùng
thistrong arrow function rồi ngạc nhiên khi nó không trỏ vào object. - Dùng
__proto__thay vìObject.getPrototypeOf(). - Dùng
classđể “giống Java” trong khi JS không bắt buộc OOP.
Checklist chi tiết
Phần tiêu đề “Checklist chi tiết”Execution Context & Call Stack
Phần tiêu đề “Execution Context & Call Stack”this Binding — 4 quy tắc
Phần tiêu đề “this Binding — 4 quy tắc”Prototype Chain
Phần tiêu đề “Prototype Chain”Proxy & Reflect
Phần tiêu đề “Proxy & Reflect”Class Modern Syntax
Phần tiêu đề “Class Modern Syntax”War Story: Debug this trong Legacy Code
Phần tiêu đề “War Story: Debug this trong Legacy Code”Bối cảnh: Codebase jQuery cũ có hàm Widget.prototype.render = function() { ... }. Khi refactor sang React Hooks, dev junior bọc hàm này trong arrow function → this undefined.
Quyết định: Không dùng arrow function bọc method cũ. Giữ nguyên bind hoặc refactor hoàn toàn sang functional style.
Bài học: this trong JS phụ thuộc vào cách gọi function, không phải nơi định nghĩa. Arrow function không có this riêng — đó là feature, không phải bug.