Chức năng Currying trong JavaScript
![](https://post.nghiatu.com/assets/images/m/max/724/1*oeLkMx0eADxnkQdQUIhDIg.jpeg)
lấy một cái bình, thêm một ít nước, thêm một số dòng mã, thêm một ít lá cà ri và masala (theo khẩu vị của bạn), nấu trên ngọn lửa nhỏ trong 25 phút, và đây là chức năng đông cứng, sẵn sàng phục vụ trong sản xuất . Đùa thôi các chàng trai và gols.
Xin chàoooo, các nhà phát triển JS. Tôi đã trở lại với một chủ đề nóng “Function Currying”
Câu chuyện này bao gồm:
- cà ri là gì, nó hoạt động như thế nào và tại sao nó được sử dụng.
Câu chuyện bắt đầu từ đây
Chức năng cà ri là gì?
currying đang chuyển đổi một hàm nhận nhiều đối số [ví dụ: functionName(a, b,c)] thành một số hàm nhận một đối số duy nhất trong một trình tự.
được rồi được rồi.., tôi biết nó nghe có vẻ con-fu-jing (khó hiểu), và phản ứng của tôi cũng giống như vậy khi tôi đọc nó lần đầu tiên.
ok chúng ta hãy hiểu nó cho dễ hiểu, một hàm (doSum) lấy tất cả các đối số trong một lần chụp tức là doSum(a, b, c) [ví dụ bên dưới: Hàm cộng bình thường.
![](https://post.nghiatu.com/assets/images/m/max/724/1*S2ZtCdbnm1IwapatWeTA3w.png)
Được chuyển đổi thành một số hàm (addNumbers(a), (b), (c)) nhận một đối số tại một thời điểm theo trình tự.
Lưu ý: Chức năng (mục đích) của cả hai chức năng là như nhau, chỉ đổi tên chúng để dễ hiểu hơn.
![](https://post.nghiatu.com/assets/images/m/max/724/1*Gw8uILJhfx4h2BSgSWOdmA.png)
đây là chức năng của currying theo chuyên viên máy tính dành cho chuyên viên máy tính :
Đây là một kỹ thuật trong lập trình chức năng, chuyển đổi chức năng của nhiều đối số thành một số chức năng của một đối số duy nhất theo trình tự.
nói một cách đơn giản, thay vì lấy tất cả các đối số cùng một lúc, hàm này sẽ lấy đối số đầu tiên và trả về hàm nhận đối số kia, rồi lại trả về một hàm khác nhận đối số thứ ba, v.v. đã lấy (ví dụ trong ảnh có tên: hàm currying).
Cà ri hoạt động như thế nào?
Curring trong javascript có thể hơi khó hiểu vì nó là javascript
nhưng hãy cố gắng vượt qua nó, bên dưới là một ví dụ về một chức năng đơn giản
![](https://post.nghiatu.com/assets/images/m/max/724/1*S2ZtCdbnm1IwapatWeTA3w.png)
ở đây, hàm “doSum” thêm đối số đã cho và trả về tổng của tất cả các đối số được truyền vào.
bên dưới là phiên bản cũ của chức năng tương tự (chỉ cần đổi tên, để hiểu rõ hơn)
![](https://post.nghiatu.com/assets/images/m/max/724/1*Gw8uILJhfx4h2BSgSWOdmA.png)
đầu ra của hàm trên và hàm dưới sẽ giống nhau, 18
addNumbers là phiên bản được chỉnh sửa của hàm doSum ở trên, addNumber hàm cha nhận đối số tức là 5 trong trường hợp của chúng ta và trả về một hàm ẩn danh khác nhận đối số khác tức là 6 trong trường hợp của chúng ta và quá trình tiếp tục cho đến khi tất cả các tham số được chuyển, hàm ẩn danh cuối cùng trả về giá trị sau khi xử lý tất cả các đầu vào.
chúng tôi đã triển khai các hàm lồng nhau trong ví dụ trên, vì vậy mỗi hàm nhận một đối số và trả về một hàm khác cho đến khi tất cả các đối số không được hoàn thành.
bạn có thể xử lý chức năng của mình theo 2 cách khác nhau, sử dụng chức năng liên kết và sử dụng bao đóng, hãy xem nó trông như thế nào
chức năng cà ri bằng cách sử dụng chức năng liên kết
nếu bạn không biết chức năng liên kết là gì, hãy xem câu chuyện này của tôi .
![](https://post.nghiatu.com/assets/images/m/max/724/1*FyLXqP4sZuHTdpdbMbVBRQ.png)
ở đây trong ví dụ trên, chúng tôi đang sử dụng chức năng liên kết của javascript và sử dụng chức năng liên kết, chúng tôi đang sử dụng chức năng “onBoardUser”.
basicCompanyDetails tương tự đối với tất cả người dùng đã tích hợp, vì vậy chúng tôi muốn cung cấp thông tin chi tiết theo mặc định cho tất cả người dùng đã tích hợp, ở đây chúng tôi đang chuyển một đối số “basicCompanyDetails” cho hàm liên kết và tạo một phiên bản của “onBoardUser”, tại đây hàm liên kết trả về hàm mà bạn có thể lưu trữ ở một vị trí nào đó trong bộ nhớ và thực thi nó sau, ở đây chúng tôi đang lưu trữ hàm trong addUser và chúng tôi đang gọi cho tất cả người dùng.
đây là cách bạn có thể cà ri chức năng của mình bằng cách sử dụng chức năng liên kết trong javascript. nhiều ví dụ hơn trong hình ảnh dưới đây.
![](https://post.nghiatu.com/assets/images/m/max/724/1*SiEXL-53S4pVSAqegRTo-g.png)
bạn cũng có thể chuyển cả hai tham số trong khi gọi phương thức addUserToSales, nó sẽ cho ra kết quả tương tự.
chức năng currying sử dụng bao đóng.
bao đóng là một khái niệm rất phổ biến nhưng phức tạp trong javascript, nhưng không được thảo luận nhiều, bạn có thể đọc về bao đóng tại đây .
hãy thử thực hiện chức năng currying bằng cách sử dụng bao đóng.
![](https://post.nghiatu.com/assets/images/m/max/724/1*9BHlTsWh1K8T5nhrnaSYxQ.png)
trong ví dụ trên, chúng tôi đã tạo một hàm “onBoardUser” nhận một đối số và nó trả về một hàm ẩn danh khác nhận một đối số khác, tổng hợp các chi tiết và trả về.
chúng ta đang gọi hàm “onBoardUser” với một đối số, ví dụ như accountDepartmentDetails và lưu trữ nó vào một biến (hãy nhớ rằng onBoardUser trả về một hàm), vì vậy chúng ta lưu trữ một hàm vào một biến addUsertoAccounts và bây giờ biến đó có một hàm có thể được gọi bất cứ lúc nào với một đối số mà nó đang yêu cầu, vì vậy chúng tôi đã gọi hàm ẩn danh (được trả về bởi onBoardUser) được lưu trữ trong addUsertoAccounts với một đối số (chi tiết người dùng tức là chi tiếtOfJohn).
khi hàm được gọi, nó đã hoàn thành việc thực thi câu lệnh có trong nó và in đầu ra.
![](https://post.nghiatu.com/assets/images/m/max/724/1*UV10pGHqoV2pTwRwGItyzA.png)
nếu các chức năng cũng được gọi sau khoảng 10 nghìn dòng mã, nó sẽ in ra cùng một đầu ra, vì nó là một bao đóng và nó ghi nhớ phạm vi từ vựng của nó.
Curing với ES6:
![](https://post.nghiatu.com/assets/images/m/max/724/1*CKDEvzeJmg1zfmGsBetwJg.png)
đây là cách bạn có thể sử dụng hàm currying với bao đóng trong JS.
tuy nhiên, bạn có thể có một câu hỏi trong đầu, Nếu chúng ta có thể truyền nhiều đối số cho một hàm thì tại sao chúng ta lại cần đến currying?
điều này có lẽ sẽ trả lời những nghi ngờ đó.
tại sao nó được sử dụng
tại sao? tại sao? tại sao?
- currying là một kỹ thuật chia các chức năng thành các chức năng nhỏ hơn, mỗi chức năng riêng lẻ có công việc riêng và điều đó làm cho chức năng của bạn thuần túy và ít bị lỗi và tác dụng phụ hơn.
- ví dụ: chức năng đầu tiên xác thực chi tiết người dùng, chức năng thứ hai xác thực chi tiết công ty, v.v.
- nó được sử dụng trong lập trình hàm để sử dụng các hàm bậc cao hơn
- nó giúp bạn giữ cho mã của mình sạch sẽ và có tổ chức.
- Ngoài ra, bạn có thể sử dụng currying như một cơ chế giúp bạn kiểm tra xem bạn có mọi thứ trước khi tiếp tục hay không
- ví dụ: mỗi hàm lồng nhau sẽ không được thực thi nếu nó không nhận được các đối số cần thiết.