Currying – Hàm nhận một hàm và một số đối số, trả về hàm chỉ có một tham số. Hàm trả về có thể chuỗi (chain) lại.
Partial Application – Một số đối số được gắn (bind) với giá trị cố định để tạo hàm mới với ít tham số hơn.
Ví dụ
<!DOCTYPE html> <html lang="vi"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Currying vs Partial</title> <style> body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; } .result { font-size: 18px; font-weight: 500; color: rebeccapurple; } </style> </head> <body> <h1>Currying vs Partial application trong JavaScript</h1> <div class="result"></div> <br /> <button class="Btn">NHẤN VÀO ĐÂY</button> <h3>Nhấn nút để xem ví dụ currying và partial application</h3> <script> let resEle = document.querySelector(".result"); let BtnEle = document.querySelector(".Btn"); function multiply(x, y) { return function (y) { return x * y; }; } function add(a, b, c, d) { return a + b + c + d; } BtnEle.addEventListener("click", () => { resEle.innerHTML = "Currying<br>multiply(2)(5) = " + multiply(2)(5) + "<br>"; let partialAdd = add.bind(this, 2, 3); resEle.innerHTML += "Partial Application <br> partialAdd(4,5) = " + partialAdd(4, 5) + "<br>"; }); </script> </body> </html>
Kết quả
Khi nhấn nút:
- Currying: multiply(2)(5) = 10
- Partial Application: partialAdd(4,5) = 14 (2+3+4+5)
Khác biệt: Currying biến hàm n-ary thành chuỗi hàm unary. Partial application fix một số args, trả về hàm (n-k)-ary. bind thường dùng cho partial application. Currying hữu ích cho function composition, point-free style.