Skip to content

JS Core Engine

This content is not available in your language yet.

Thời gian: 4 buổi × 90 phút = 6 giờ
Output: CodePen collection + Excalidraw diagram + Note Obsidian

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.

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

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.

  • Dùng this trong 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.

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.