Currying là một kỹ thuật nâng cao để làm việc với các chức năng. Nó không chỉ được sử dụng trong JavaScript mà còn được sử dụng trong các ngôn ngữ khác.
Currying là một phép biến đổi hàm để chuyển một hàm từ có thể gọi là f (a, b, c) thành có thể gọi là f (a) (b) (c).
Currying không gọi một hàm. Nó chỉ biến đổi nó.
Trước tiên, chúng ta hãy xem một ví dụ để hiểu rõ hơn về những gì chúng ta đang nói và sau đó là các ứng dụng thực tế.
Chúng tôi sẽ tạo một hàm trợ giúp curry (f) thực hiện việc xử lý curry cho một đối số f hai. Nói cách khác, curry (f) cho hai đối số f (a, b) chuyển nó thành một hàm chạy dưới dạng f (a) (b):
function curry(f) {
// curry(f) does the currying transform
return function(a) { return function(b) { return f(a, b); }; }; }
// usage
function sum(a, b) { return a + b; }
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 3
Các triển khai nâng cao hơn của currying, chẳng hạn như _.curry từ thư viện lodash, trả về một trình bao bọc cho phép một hàm được gọi cả bình thường và một phần:
function sum(a, b) {
return a + b;
}
let curriedSum = _.curry(sum); // using _.curry from lodash library
alert( curriedSum(1, 2) ); // 3, still callable normally
alert( curriedSum(1)(2) ); // 3, called partially
Advanced curry implementation
Trong trường hợp bạn muốn đi vào chi tiết, đây là cách triển khai curry "nâng cao" cho các hàm đa đối số mà chúng tôi có thể sử dụng ở trên.
It’s pretty short:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
Usage examples:
function sum(a, b, c) {
return a + b + c;
}
let curriedSum = curry(sum);
alert( curriedSum(1, 2, 3) ); // 6, still callable normally
alert( curriedSum(1)(2,3) ); // 6, currying of 1st arg
alert( curriedSum(1)(2)(3) ); // 6, full currying
Summary
Currying là một phép biến đổi làm cho f (a, b, c) có thể gọi là f (a) (b) (c). Việc triển khai JavaScript thường giữ cho hàm có thể gọi bình thường và trả về một phần nếu số đối số không đủ.
Currying cho phép chúng tôi dễ dàng nhận được các bữa tiệc. Như chúng ta đã thấy trong ví dụ ghi nhật ký, sau khi giải thích bản ghi hàm phổ quát ba đối số (ngày, mức độ quan trọng, thông báo) cung cấp cho chúng ta các phần tử khi được gọi với một đối số (như nhật ký (ngày)) hoặc hai đối số (như nhật ký (ngày tháng, mức độ quan trọng) )).
Readmore: https://javascript.info/currying-partials#advanced-curry-implementation