Hàm là một trong những thành phần quan trọng trong lập trình. Chúng được định nghĩa để thực hiện một tác vụ cụ thể và có thể được gọi đi gọi lại để thực thi. Sự khác biệt chính giữa các hàm trong Javascript và các ngôn ngữ lập trình khác là trong javascript, các hàm thuộc đối tượng hạng nhất, có nghĩa là chúng hoạt động giống như các đối tượng và có thể được gán cho các biến, mảng và các đối tượng khác
Bài đăng này thảo luận về ba cách khác nhau để xác định chức năng
- Khai báo hàm
- Biểu thức hàm
- Chức năng máy phát điện
1. Khai báo hàm
Có lẽ là cách phổ biến nhất để khai báo một hàm. Hãy nhìn vào cú pháp của nó
Cú pháp khai báo hàmKhai báo hàm bao gồm từ khóa function
theo sau là tên bắt buộc của hàm và sau đó là tham số trong một cặp dấu ngoặc đơn [bạn cũng có thể định nghĩa một hàm mà không cần đối số]. Cuối cùng, trong một cặp dấu ngoặc nhọn là phần thân của hàm, hàm thực hiện một tác vụ thực tế
Điều quan trọng là bạn phải biết sự khác biệt giữa tham số và đối số của hàm. Một tham số là một biến khi xác định một chức năng. Khi một hàm được gọi, các đối số là dữ liệu thực tế mà bạn chuyển vào các tham số của hàm
Đầu tiên, hãy xem một ví dụ đơn giản
Một hàm có tên hello
được khai báo với một đối số name
, ghi lại một thông báo trong bảng điều khiển. Như bạn có thể thấy từ ví dụ, vì không có loại nào được chỉ định trên đối số nên nó hoạt động cho cả chuỗi và số. Nhưng nếu tôi chỉ muốn chức năng của mình chào một tên chứ không phải một số thì sao?
Theo mặc định, các chức năng trả về không xác định. Để trả về bất kỳ giá trị nào khác, hàm phải có câu lệnh return chỉ định giá trị sẽ trả về
Hoisting
trong Khai báo hàm là gì?
Nói một cách đơn giản, điều đó có nghĩa là bất kể bạn khai báo các hàm hoặc biến ở đâu khi mã được thực thi, chúng sẽ được chuyển lên đầu phạm vi của chúng. Điều này được gọi là cẩu
Hãy xem một ví dụ
cẩu trong khai báo hàmỞ đây tôi đã gọi hàm trước khi tôi tuyên bố - đây là hoisting
2. Biểu thức hàm
Một biểu thức hàm rất giống và có cú pháp gần giống như một câu lệnh hàm. Sự khác biệt chính là một biểu thức hàm không bắt đầu bằng từ khóa function
và name
của hàm cũng là tùy chọn, trong trường hợp đó, nó trở thành Hàm ẩn danh. Nếu hàm có name
thì nó được gọi là Biểu thức hàm được đặt tên
Bây giờ hãy xem cách ẩn danh để xác định chức năng trên
Biểu thức hàm ẩn danhMột điểm khác biệt quan trọng giữa Khai báo hàm và Biểu thức hàm là không có cẩu trong Biểu thức hàm. Nếu bạn thử chương trình tương tự như chương trình trong Khai báo chức năng cẩu, bạn sẽ gặp lỗi
IIFE [Biểu thức hàm được gọi ngay lập tức]
Điều này có nghĩa là hàm chạy ngay khi nó được định nghĩa, ở đây biểu thức hàm được đặt trong Grouping Operator[],
Tại sao chúng ta cần một IIFE trong biểu thức chức năng điển hình của mình? . Nó được thực thi ngay lập tức và không bao giờ trong tương lai nó được chương trình truy cập lại. Vì nó không được gọi lại nên nó không cần tên, vì vậy biểu thức hàm ẩn danh được ưu tiên cho IIFE
3. Chức năng máy phát điện
Các chức năng bình thường tuân theo mô hình chạy đến khi hoàn thành và không thể dừng trước khi thực hiện dòng cuối cùng. Nếu bạn muốn thoát giữa chừng, bạn phải quay lại hoặc đưa ra lỗi
Chức năng Trình tạo có thể bị dừng giữa chừng khi thực hiện. Khi nó được gọi lại, nó tiếp tục từ nơi nó dừng lại
Nó được khai báo giống như một hàm bình thường nhưng với sự khác biệt là hàm tạo có dấu hoa thị * sau từ khóa function
và bất kỳ khoảng trắng nào cũng có thể được bao gồm giữa chúng
Một điều nữa cần lưu ý. trong JavaScript, trình tạo là một hàm trả về một đối tượng mà bạn có thể gọi next[]
. Mọi lời gọi của next[]
sẽ trả về một đối tượng có cấu trúc như thế này
Bây giờ, đối tượng này có hai thuộc tính. hello
0 và hello
1. hello
2 là giá trị thực của đối tượng, trong khi đó hello
1 là thuộc tính chỉ định việc kết thúc hàm — giá trị mặc định là false và khi nó trở thành true, hàm sẽ dừng
Hãy hiểu nó tốt hơn với một ví dụ đơn giản
Bên trong thân hàm, chúng tôi không sử dụng từ khóa return — thay vào đó sử dụng hello
4, nếu sử dụng hello
5, nó sẽ thay đổi thuộc tính hello
1 thành hello
7 và hàm sẽ kết thúc — mọi thứ sau nó sẽ không thực thi. hello
8 đưa ra giá trị được gán cho nó
Đầu tiên, chúng ta xác định hàm của mình sau đó chúng ta gọi nó, việc gọi hàm tạo dẫn đến một đối tượng trình tạo được lưu trữ trong biến gen
Sau đó, chúng tôi gọi đối tượng bằng cách sử dụng thuộc tính next[]
và hello
0,
Lần đầu tiên next[]
được sử dụng, việc thực thi chức năng bắt đầu. Đầu tiên nó chạy console. log [“Người đầu tiên thực thi”] và ghi nhật ký vào bảng điều khiển, sau đó nó gặp name
2— trả về giá trị “tạm dừng” và quá trình thực thi dừng lại
Lần thứ hai next[]
được gọi, nó bắt đầu từ nơi nó rời đi lần trước. Một lần nữa, đầu tiên nó chạy name
4 và sau đó gặp name
2 và cho ra giá trị “kết thúc chức năng”, sau đó chức năng dừng lại
Lần thứ ba next[]
được gọi, undefined được xem là kết quả. Điều này xảy ra bởi vì một đối tượng được tạo từ hàm trình tạo chỉ có thể được lặp lại một lần - đối tượng hiện không còn tác dụng và một đối tượng mới phải được tạo để chương trình bắt đầu lại
Nếu tôi sử dụng_______2_______7 thay vì name
8, giá trị của dữ liệu được thay đổi thành name
9 và không có gì được thực thi sau đó
Trình tạo khi kết hợp với Lời hứa là một công cụ rất mạnh để lập trình không đồng bộ. Chúng giảm thiểu, nếu không muốn nói là loại bỏ hoàn toàn, các vấn đề với lệnh gọi lại
Phần kết luận. Cách nào tốt hơn?
Chà, chúng ta không thể so sánh chúng và nói cái này tốt hơn cái kia - kiểu tuyên bố tùy thuộc vào tình huống hoặc điều kiện
Bạn có thể sử dụng Hàm tạo để có chức năng Async tốt hơn và Biểu thức hàm ẩn danh cho chức năng bạn muốn thực thi ngay lập tức