JavaScript - Ý tưởng về lập trình chức năng.
Lập trình hàm là một mô hình lập trình nhấn mạnh việc viết chương trình sử dụng các hàm thuần túy, không có tác dụng phụ và luôn trả về cùng một đầu ra với cùng một đầu vào. JavaScript là ngôn ngữ đa mô hình hỗ trợ lập trình chức năng, cùng với các mô hình lập trình khác như lập trình hướng đối tượng và lập trình mệnh lệnh.
Các hàm thuần túy rất quan trọng trong lập trình hàm vì chúng có tính xác định và không có tác dụng phụ, giúp chúng dễ dàng suy luận, kiểm tra và gỡ lỗi hơn. Hiệu ứng phụ là bất kỳ hiệu ứng hoặc tương tác có thể quan sát nào xảy ra bên ngoài phạm vi của một hàm hoặc phương thức do quá trình thực thi của nó. Điều này có thể bao gồm sửa đổi một biến hoặc đối tượng bên ngoài phạm vi của hàm, ghi vào tệp hoặc thực hiện bất kỳ thao tác I/O nào.
function add(a, b) {
return a + b;
}
Vì các hàm không có tác dụng phụ và tạo ra cùng một đầu ra mỗi khi chúng được gọi với cùng một đầu vào, chúng ta có thể làm cho chúng linh hoạt hơn và áp dụng các thuộc tính/kỹ thuật thú vị được liệt kê bên dưới:
- Idempotence : Tính năng này có thể hữu ích trong nhiều tình huống, chẳng hạn như trong lệnh gọi API, cập nhật cơ sở dữ liệu hoặc cập nhật giao diện người dùng, nơi bạn muốn đảm bảo rằng cùng một thao tác không được thực thi nhiều lần.
// Applying this function multiple times on the same number will always return the same result.
Math.abs(-5) // Returns 5
Math.abs(Math.abs(-5)) // Also returs 5
// Example of currying
function multiply(a) {
return function(b) {
return a*b;
}
}
const multiplyBy2 = multiply(2);
multiplyBy2(6);
// Returns 6*2 = 12
// Example of Partial Application
function multiply(a,b,c) {
return a*b*c;
}
const multiplyBy2 = multiply.bind(null, 2);
multiplyBy2(3,4)
// Returns 2*3*4 = 24
- Ghi nhớ : Đây là một kỹ thuật được sử dụng để tối ưu hóa hiệu suất của các chức năng bằng cách lưu trữ kết quả của các lệnh gọi chức năng đắt tiền và trả về kết quả được lưu trong bộ nhớ cache khi các đầu vào tương tự xảy ra lần nữa. Trong JavaScript, việc ghi nhớ có thể được thực hiện bằng cách sử dụng bao đóng và đối tượng.
// Example of Memoization
const memoizedOperation = (() => {
let cache = {};
return (n) => {
if (n in cache) {
console.log("Returning cached value: ");
return cache[n];
} else {
console.log("Performing operation: ");
cache[n] = n*10;
return cache[n];
}
}
})();
console.log(memoizedOperation(4));
console.log(memoizedOperation(4));
console.log(memoizedOperation(5));
/*
Returns:
Performing operation:
40
Returning cached value:
40
Performing operation:
50
*/
compose()và pipe()(được cung cấp bởi các thư viện như Lodash hoặc Ramda) hoặc chúng ta cũng có thể xác định các chức năng của riêng mình.// Example of Composition by creating our own function
const compose = (f,g) => (n) => f(g(n));
const pipe = (f,g) => (n) => g(f(n));
const multiplyBy2 = (n) => n * 2;
const add2 = (n) => n + 2;
const multiplyAndAddComp = compose(multiplyBy2, add2)
const multiplyAndAddPipe = pipe(multiplyBy2, add2)
console.log("Compose: ", multiplyAndAddComp(5));
console.log("Pipe: ", multiplyAndAddPipe(5));
/*Returns:
Compose: 14
Pipe: 12
*/
Các chức năng này được sử dụng để thành phần chức năng trong JavaScript. Hàm composenhận hai hàm fvà g, làm đối số và trả về một hàm mới là thành phần của fvà g. Hàm được trả về nhận một đối số n, áp dụng gcho nvà sau đó áp dụng fcho kết quả. Hàm này pipehoạt động tương tự như compose, nhưng nó áp dụng các hàm theo thứ tự ngược lại. Nó nhận hai hàm fvà g, làm đối số và trả về một hàm mới áp dụng fcho kết quả của g. Đoạn mã này cũng định nghĩa hai hàm đơn giản multiplyBy2và add2, được sử dụng để soạn các hàm. Đoạn mã sau đó tạo ra hai chức năng mới, multiplyAndAddCompvàmultiplyAndAddPipe, bằng cách soạn các hàm multiplyBy2và add2bằng cách sử dụng các hàm composevà pipetương ứng. Cuối cùng, console.logcác câu lệnh in ra kết quả của việc áp dụng multiplyAndAddCompvà multiplyAndAddPipecho số 5.
multiplyAndAddComptrước tiên nhân 5 với 2 rồi cộng 2 với nó bằng cách sử dụng hàm tổng hợp, vì vậy kết quả là 12. multiplyAndAddPipetrước tiên cộng 2 với 5 rồi nhân kết quả với 2 bằng cách sử dụng hàm tổng hợp, vì vậy kết quả là 14.
Hàm càng có ít tham số thì càng dễ sử dụng hàm đó với các kỹ thuật ở trên.
Phần kết luận
Bây giờ, ý tưởng về lập trình chức năng là tách dữ liệu và chức năng hoặc logic, điều này làm cho mã rõ ràng và dễ hiểu, có thể mở rộng, có thể bảo trì và quan trọng hơn là KHÔ.

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































