Bỏ qua để đến nội dung

Arrow Functions

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); // 25

Arrow 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, ...

Arrow function không có object arguments. Dùng rest parameter thay thế:

// ❌ arguments không tồn tại trong arrow function
const bad = () => console.log(arguments); // ReferenceError
// ✅ Dùng rest parameter
const sum = (...args) => args.reduce((a, b) => a + b, 0);
sum(1, 2, 3); // 6

Không thể dùng arrow function với new. Nó không có [[Construct]]prototype:

const Person = (name) => { this.name = name; };
new Person("An"); // ❌ TypeError: Person is not a constructor

Chú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

  • Callback ngắn: map, filter, reduce
  • Hàm không cần this hoặc arguments
  • Logic gọn một dòng:
const names = ["a", "b", "c"];
const upper = names.map(n => n.toUpperCase());
// ["A", "B", "C"]

❌ Không nên dùng

  • Method trong object nếu cần this:
const obj = {
name: "An",
greet: () => console.log(this.name),
// ❌ this không trỏ về obj
};
  • Constructor (không dùng được new)
  • Nơi cần arguments object

Điểm khácArrow functionFunction thường
thisLấ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.targetLexical (từ scope cha)Riêng của hàm
Cú phápRất gọn (=>)Dài hơn (function)
Hoisting❌ Không (khi gán cho biến)✅ Có (function declaration)