Mỗi hàm đều có một danh sách các tham số có thể là danh sách rỗng hay chứa rất nhiều tham số. Với những hàm chứa nhiều tham số trong danh sách tham số thì việc gọi hàm và chuyển các đối số cho nó sẽ gây khó khăn, khó đọc, và cũng khó bảo trì. Trong JavaScript hỗ trợ kĩ thuật Currying cho phép tách danh sách đối số (rất dài) thành các danh sách ngắn hơn cho phép dễ đọc và dễ bảo trì code trong tương lai. Lưu ý thứ tự các tham số và các đối số tương ứng là rất quan trọng.
Xét ví dụ tạo một hàm hiển thị thông điệp xin chào đến một người nào đó như sau:
var greet = function (greeting, name) { alert (greeting + "," + name); }; greet("Hello", "Minh"); // Hello,Minh
hàm trên có 2 tham số là greeting và name. Áp dụng kĩ thuật Currying để tách hai tham số này như sau:
var greetCurried = function(greeting) { return function(name) { alert (greeting + ", " + name); }; };
Sử dụng hàm greetCurried như sau:
var greetMessage = greetCurried("Hello"); greetMessage("Minh"); //"Hello,Minh"
hay cũng có thể viết như sau:
greetCurried("Hello")("Minh");
Giả sử hàm greet có 3 tham số như sau:
var greet = function (greeting, separator, name) { alert (greeting + separator + name); }; greet("Hello", "…", "Minh"); // Hello…Minh
Áp dụng kĩ thuật Currying tách 3 tham số:
var greetCurried = function(greeting) { return function(separator) { return function(name) { alert (greeting + separator + name); }; }; }; var greetMessage = greetCurried("Hello")("..."); greetMessage ("Minh"); //Hello...Minh
Cách áp dụng Currying như trên, nếu danh sách tham số dài, sẽ rất nhiều hàm trả về lồng nhau, gây phức tạp và khó đọc. Có thể khắc phục vấn đề này bằng cách tận dụng đối tượng Array và phương thức slice và concat của nó. Hàm curryIt lấy danh sách tham số và dùng chúng để trả về một phiên bản Currying của hàm gốc:
var curryIt = function(uncurried) { var parameters = Array.prototype.slice.call(arguments, 1); return function() { return uncurried.apply(this, parameters.concat( Array.prototype.slice.call(arguments, 0))); }; };
Áp dụng hàm curryIt cho kĩ thuật Currying như sau:
var greeter = function (greeting, separator, name) { alert (greeting + separator + name); }; var greetMessage = curryIt(greeter, "Hello", ", "); greetMessage("Minh"); //Hello, Minh
Ý kiến bài viết