✅ Nên dùng
- Callback ngắn:
map,filter,reduce - Hàm không cần
thishoặcarguments - Logic gọn một dòng:
const names = ["a", "b", "c"];const upper = names.map(n => n.toUpperCase());// ["A", "B", "C"]Arrow function expression là cách viết hàm ngắn gọn trong JavaScript, giới thiệu từ ES6. Thay vì dùng function, bạn dùng ký hiệu =>. Thường được dùng cho các hàm ngắn, callback, hoặc khi muốn giữ nguyên ngữ cảnh this.
const add = (a, b) => a + b;Có thể bỏ ngoặc ():
const square = x => x * x;
square(5); // 25Bắt buộc có ():
const sum = (a, b) => a + b;
sum(3, 7); // 10Bắt buộc có ():
const getTime = () => Date.now();
getTime(); // 1709474400000Nếu thân hàm gồm nhiều câu lệnh, bạn phải dùng {} và viết return rõ ràng:
const add = (a, b) => { const result = a + b; return result;};
add(2, 3); // 5Bọc object literal trong () để tránh nhầm với block {}:
const getUser = () => ({ name: "Giang", role: "PO" });
getUser(); // { name: "Giang", role: "PO" }this riêngArrow function không tự bind this. Nó lấy this từ scope bao quanh (lexical this).
function Counter() { this.count = 0;
setInterval(() => { this.count++; // ✅ `this` trỏ về instance Counter console.log(this.count); }, 1000);}
new Counter(); // 1, 2, 3, ...function Counter() { this.count = 0;
setInterval(function() { this.count++; // ❌ `this` là global/undefined console.log(this.count); }, 1000);}
new Counter(); // NaN, NaN, ...argumentsArrow function không có object arguments. Dùng rest parameter thay thế:
// ❌ arguments không tồn tại trong arrow functionconst bad = () => console.log(arguments); // ReferenceError
// ✅ Dùng rest parameterconst sum = (...args) => args.reduce((a, b) => a + b, 0);
sum(1, 2, 3); // 6Không thể dùng arrow function với new. Nó không có [[Construct]] và prototype:
const Person = (name) => { this.name = name; };
new Person("An"); // ❌ TypeError: Person is not a constructorsuper và new.target riêngChúng cũng được lấy theo ngữ cảnh lexical bên ngoài — giống cách this hoạt động.
✅ Nên dùng
map, filter, reducethis hoặc argumentsconst names = ["a", "b", "c"];const upper = names.map(n => n.toUpperCase());// ["A", "B", "C"]❌ Không nên dùng
this:const obj = { name: "An", greet: () => console.log(this.name), // ❌ this không trỏ về obj};new)arguments object| Điểm khác | Arrow function | Function thường |
|---|---|---|
this | Lấy từ scope cha (lexical) | Bind theo cách gọi |
arguments | ❌ Không có | ✅ Có |
new | ❌ Không dùng được | ✅ Dùng được |
prototype | ❌ Không có | ✅ Có |
super / new.target | Lexical (từ scope cha) | Riêng của hàm |
| Cú pháp | Rất gọn (=>) | Dài hơn (function) |
| Hoisting | ❌ Không (khi gán cho biến) | ✅ Có (function declaration) |