Lesson 10: Function
Last updated
Last updated
Chắc hẳn trong toán học, ta đều quen thuộc với các hàm f(x)
; f(x, y)
...
Ví dụ:
Với A, B là số bất kỳ, x là tham số. Giả sử A = 5; B = 10;
Vậy lúc này công thức hàm sẽ là:
Khi viết f(10)
tức thay thế x
bằng 10 cho công thức trên:
Suy ra: f(10) = 60
Kết quả trên, tưởng chừng đơn giản, nhưng là một khái niệm được ứng dụng rất nhiều, mục tiêu của hàm sinh ra, là để khái quát logic, với những logic cho trước, chỉ cần truyền các giá trị tương ứng cho các tham số, sẽ được thay thế vào các vị trí trong logic để tạo ra kết quả.
Trong lập trình, giả sử có một bài toán đơn giản: Tính chu vi hình chữ nhật.
Về cơ bản, ta sẽ làm như sau:
Javascript
Typescript
Trong trường hợp ta có nhiều phép tính phải tính với các giá trị khác nhau, ví dụ như:
Đối với logic đơn giản, nghiệp vụ thực hiện lại rất ít, đơn giản nên ta có thể không thấy sự khó khăn ở trong này, nhưng nếu như với một logic, nghiệp vụ lớn, khó sự phức tạp, việc code đi code lại (kể cả copy & paste) cũng sẽ dẫn tới sai xót không mong muốn, thậm chí làm cho mã nguồn trở nên dày đặc, rối loạn hơn.
Vậy, giống trong toán học, hàm sẽ đại diện cho một đoạn logic nào đó, giúp việc thể hiện được ngắn gọn hơn, thậm chí là rõ ràng hơn.
Ứng dụng của hàm:
Tái sử dụng mã: Một hàm có thể được gọi nhiều lần, giúp giảm sự trùng lặp mã.
Tổ chức mã: Hàm giúp chia mã nguồn thành các phần logic nhỏ, giúp dễ quản lý hơn.
Tăng tính linh hoạt: Hàm có thể nhận tham số và trả về giá trị khác nhau tùy thuộc vào cách nó được gọi.
Cú pháp:
Với:
function - là cú pháp định nghĩa/khai báo hàm
functionName - là tên hàm muốn đặt (thường, tên hàm cần đặt theo ý nghĩa của logic)
()
là đặc trưng hàm, giống như f(x)
có ()
Ví dụ:
Lúc này, nếu muốn tải sử dụng các logic, chỉ cần gọi lại hàm, chương trình sẽ thực hiện chính xác logic đã được lập trình. Tuy nhiên, theo những ví dụ trên, còn thiếu việc truyền tham số.
Như ví dụ này, trong logic, vẫn nhận đầu vào width
, length
cố định được khai báo bên ngoài. Vậy, ta cần triển dạng hàm có thể nhận đầu vào tham số.
Giống như toán học, các hàm f(x)
; f(x, y)
v.v... Mục tiêu là để khi truyền vào các giá trị, sẽ sử dụng giá trị đó thay thế vào logic để thực hiện kết quả. Có một lưu ý đặc biệt rằng truyền tham số phải đúng thứ tự
Cú pháp
Ví dụ sử dụng:
Typescript
Khi tạo các tham số, giống như việc tạo ra 1 biến mới, sử dụng trong phạm vi của hàm, không liên quan gì tới các giá trị, hay các biến được truyền
Lưu ý:
Số lượng tham số không giới hạn
Tham số truyền phải đúng thứ tự
Nên đặt tên tham số có ý nghĩa
Các cách định nghĩa, sử dụng hàm phía trên mới chỉ log ra giá trị, như toán toán học, giả sử f(x) = Ax + B
, vậy chứng tỏ rằng hàm có thể bằng một giá trị. Thử xem kết quả ví dụ sau:
Kết quả trên log là undefined
chứng tỏ ta hoàn toàn có cách để hàm có thể có giá trị giống như kết quả của hàm trong toán học. Cú pháp như sau:
Ví dụ:
Javascript
Typescript
Nếu hàm không trả về giá trị gì, thì kiểu trả về sẽ là void
Một dạng thức khác về việc định nghĩa Function trong Javascript. Đối với cách khai báo phía dưới đây, được gọi là Normal function
Arrow function
Về cơ bản, 2 dạng thức này chỉ khác nhau về cú pháp, việc sử dụng tương đối giống nhau, tuy nhiên Arrow function sẽ có điểm mạnh khi sử dụng truyền tham số và trả về giá trị
Truyền tham số:
Nếu chỉ có một tham số, Arrow function không bắt buộc phải có ngoặc tròn. Nhưng nếu từ 2 tham số trở lên bắt buộc phải có.
Trả về giá trị:
Nếu nội dung của hàm chỉ là một biểu thức (một phép tính hoặc logic), có thể bỏ qua dấu ngoặc nhọn {}
và return
, vì JavaScript sẽ ngầm định trả về giá trị của biểu thức đó.
Sự khác biệt giữa Arrow function và Normal function còn rất nhiều và quan trọng, hãy dành thời gian tìm hiểu tiếp để nắm rõ!
Hàm ẩn danh - hàm không xác định, là một khái niệm, bản chất cũng là một hàm, tuy nhiên nó là một giá trị hàm, cần có một biến để lưu trữ lại và không có tên (giống như cách sử dụng arrow function). Lúc này biến sẽ đóng vài trò giống như tên hàm.
Rest operator là cách để tạo ra một function với vô hạn tham số truyền vào.
Lưu ý:
Lúc này, tham số args sẽ đóng vai trò là một mảng
Trường hợp, nếu không được truyền vào, thì args sẽ là một mảng rỗng
Các giá trị truyền với Rest không nhất thiết phải cùng một kiểu dữ liệu
Khi sử dụng Rest, cần đảm bảo tham số luôn phải ở vị trí cuối cùng của tham số