Higher-order function (HOF) là hàm nhận hàm làm tham số, trả về hàm, hoặc cả hai.
javascript
// 1. nhận hàm
[1, 2, 3].filter((n) => n > 1)
// 2. trả về hàm
const withPrefix = (prefix) => (msg) => `[${prefix}] ${msg}`
const logError = withPrefix('ERROR')
logError('không kết nối được') // '[ERROR] không kết nối được'
// 3. cả hai — mẫu decorator
function withLogging(fn) {
return function (...args) {
console.log('gọi', fn.name, args)
return fn.apply(this, args)
}
}
const safeParse = withLogging(JSON.parse)HOF có mặt ở khắp nơi trong thực tế:
- map, filter, reduce, sort, forEach
- middleware Express: (req, res, next) => {}
- useMemo, useCallback, HOC trong React
- debounce, throttle, memoize
Điều kiện để làm được: JavaScript coi hàm là first-class value — gán vào biến, đưa vào mảng, truyền đi và trả về như mọi giá trị khác.
Lưu ý khi tự viết HOF: dùng fn.apply(this, args) chứ không fn(...args), nếu không hàm được bọc sẽ mất this khi nó vốn là method của object.