Chúng ta có thể quay lại từ một hàm JavaScript không?

Như bạn có thể thấy, biến result bây giờ là một hàm. Hãy hiển thị kết quả công việc của nó trong bảng điều khiển. Để làm điều này, hãy viết dấu ngoặc đơn cho nó

function func[] { return function[] { return '!'; }; } let result = func[]; console.log[ result[] ]; // shows '!'

Kể từ khi gọi func[] trả về một hàm, chúng ta có thể gọi ngay hàm được trả về này, như thế này. func[][] - dấu ngoặc đơn đầu tiên lấy kết quả của hàm func [bản thân nó là một hàm] và dấu ngoặc đơn thứ hai được áp dụng cho kết quả của func

Hãy thử

function func[] { return function[] { return '!'; }; } console.log[ func[][] ]; // shows '!'

Tạo hàm func1, khi được gọi như thế này. function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'0, sẽ trả về số function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'1. Thực hiện một hàm tương tự function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'2 trả về số function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'3. Tìm tổng kết quả của các hàm này

Bất kỳ cấp độ làm tổ nào

Cũng có thể có các cuộc gọi chức năng như vậy. function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'4 và function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'4 - và cứ tiếp tục như vậy đến vô tận

Để làm điều này, bạn cần hàm bên trong cũng trả về một hàm, hàm đó - hàm khác, v.v. Đây là một ví dụ

function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'6

Làm cho hàm func đó, khi được gọi như thế này. function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'8, sẽ trở lại function func[] { return function[] { return '!'; }; } let result = func[]; // there will be a function in the variable result console.log[result]; // shows 'function[] {return '!';}'9

Thông số

Bạn có thể truyền tham số cho lời gọi hàm mà chúng ta đã học. Trong ví dụ sau, hàm bên trong mong đợi một chuỗi làm tham số và in nó ra bàn điều khiển

result0

Dấu ngoặc thứ hai tương ứng với hàm bên trong khi được gọi, có nghĩa là chúng ta chuyển chuỗi mong muốn sang dấu ngoặc thứ hai này

result1

Hãy làm cho cả hàm đầu tiên nhận tham số và hàm thứ hai. Và kết quả của cuộc gọi sẽ là tổng của các tham số này

result2

Tạo hàm func, khi được gọi như thế này. result6, sẽ trả về một mảng các số được truyền trong tham số

Từ kinh nghiệm của bản thân, tôi có thể nói rằng việc trả về hàm từ hàm gây khó khăn lớn nhất cho người mới bắt đầu. Và vấn đề không phải là bản thân việc trả lại phức tạp, mà là lúc đầu, rất khó hiểu tại sao điều này có thể cần thiết. Trong thực tế, kỹ thuật này thường được sử dụng, cả trong JS và nhiều ngôn ngữ khác. Các hàm chấp nhận hàm trả về hàm là phổ biến cho bất kỳ mã js nào

Hãy bắt đầu

Các hàm là cùng một dữ liệu dưới dạng số hoặc chuỗi, vì vậy các hàm có thể được truyền cho các hàm khác dưới dạng đối số, cũng như được trả về từ các hàm. Thậm chí chúng ta có thể định nghĩa một hàm bên trong một hàm khác và đưa nó ra bên ngoài. Và điều này không có gì đáng ngạc nhiên. Các hằng số có thể được tạo ở bất cứ đâu

Bạn thậm chí có thể làm mà không cần tạo một hằng số trung gian

Luôn luôn, khi bạn nhìn thấy những cuộc gọi như vậy func[]3, hãy biết. các chức năng đã trở lại

Bây giờ hãy xem cách khác để mô tả chức năng func[]4

Để rõ ràng, bạn có thể đặt dấu ngoặc

Định nghĩa hàm có tính kết hợp đúng. Mọi thứ ở bên phải của func[]5nó được coi là thân hàm. Số lượng đầu tư không hạn chế. Hoàn toàn có thể đáp ứng các tùy chọn như vậy

Cùng một chức năng có thể được biểu diễn theo một cách khác, bằng cách loại bỏ từng chức năng trong hằng số riêng của nó. Phương pháp này hữu ích như một thử nghiệm suy nghĩ, để hiểu nơi một chức năng kết thúc và một chức năng khác bắt đầu, nhưng bản thân nó sẽ không hoạt động vì tính bao đóng bị mất

Hãy thử lướt qua các lời gọi hàm trên để hiểu kết quả nhận được như thế nào. Sau mỗi lần gọi [ngoại trừ lần gọi cuối cùng], một hàm mới được trả về, trong đó giá trị từ hàm bên ngoài được thay thế bằng một bao đóng

Như đã thấy ở trên func[]6, func[]7và func[]8- một hàm và func[]9 có số, vì tất cả các hàm bên trong đều được gọi

Hãy viết ra tất cả các chức năng

  • Hàm func[][]0 chấp nhận func[][]1 và trả về một hàm
  • chấp nhận func[][]2 và trả về một hàm
  • chấp nhận func[]40 và trả về một hàm
  • trả về tổng của x + y + z

Hãy thử phát triển ý tưởng về hàm func[]41 từ bài học trước. Hãy viết một hàm func[]42không áp dụng hàm ngay lập tức mà tạo một hàm mới

Hàm func[]42 nhận một hàm làm đối số và trả về một hàm mới. Bên trong hàm mới, hàm ban đầu được gọi hai lần

Tạo một hàm func[]44. Nó sẽ là hàm trả về ________ 242 nếu bạn truyền cho nó một hàm ________ 246[nó tính căn bậc hai của số]

Hóa ra là func[]44- đây là một hàm lấy một số và trả về gốc của gốc - func[]48

Một vi dụ khac. hãy chuyển một hàm func[]42new cho hàm một cách nhanh chóng mà không cần tạo nó trước. Hàm đã truyền bình phương số

Hàm bây giờ func[]50 bình phương số hai lần. [42] 2

Hàm func[]42 có tên như vậy là có lý do. Thực tế là mỗi lần trả về một hàm sẽ tạo ra một hàm mới với mỗi lần gọi, ngay cả khi phần thân của các hàm này giống nhau

Do đó, về bất kỳ chức năng nào trả về một chức năng, bạn có thể nói rằng nó tạo ra một chức năng. Khá đơn giản để nhớ, nếu bạn nghe hoặc đọc ở đâu đó rằng các chức năng đang được tạo ra, sau đó sẽ có người trả lại chúng

Ngắn mạch

Công việc của hầu hết các ví dụ được mô tả đều dựa trên một thuộc tính thú vị được gọi là “đóng cửa”

Khi func[]52 hoàn thành công việc của mình và trả về hàm mới, thể hiện hàm func[]52 biến mất, bị hủy cùng với các đối số được sử dụng bên trong

Nhưng hàm được trả về func[]52 vẫn đang sử dụng đối số. Trong điều kiện bình thường, nó sẽ biến mất mãi mãi, nhưng ở đây nó đã được "ghi nhớ" hoặc "đóng" bên trong hàm được trả về. Về mặt kỹ thuật, một chức năng bên trong, giống như bất kỳ chức năng nào khác trong JS, được liên kết với môi trường từ vựng của nó, không biến mất, ngay cả khi chức năng rời khỏi môi trường này

Hàm được trả về từ func[]52 được gọi là hàm đóng. Một bao đóng là một chức năng “ghi nhớ” một phần của môi trường nơi nó được chỉ định. Hàm tự đóng các mã định danh [mọi thứ mà chúng ta xác định] khỏi phạm vi từ vựng

Hãy tưởng tượng rằng chúng tôi đang thiết kế một hệ thống trong đó bạn cần nhớ mật khẩu của người dùng và sau đó kiểm tra mật khẩu đó khi người dùng đăng nhập lại. Bạn có thể mô phỏng một hàm func[]56 chấp nhận mật khẩu làm đầu vào và trả về một biến vị ngữ, nghĩa là một hàm trả về đúng hoặc sai, để kiểm tra nó. Xem nó trông như thế nào

Chúng ta có thể trả về giá trị từ hàm JavaScript không?

JavaScript cung cấp khả năng chuyển một giá trị trở lại mã đã gọi nó sau khi mọi thứ trong hàm cần chạy đã chạy xong. JavaScript chuyển một giá trị từ một hàm trở lại mã gọi nó bằng cách sử dụng câu lệnh return . Giá trị được trả về được chỉ định trong return.

Chúng ta có thể trả lại hàm từ hàm không?

Một hàm là một thể hiện của kiểu Đối tượng. Bạn có thể lưu trữ chức năng trong một biến. Bạn có thể chuyển hàm dưới dạng tham số cho hàm khác. Bạn có thể trả về hàm từ một hàm .

Bạn có thể trả về một giá trị từ một hàm không?

Để trả về giá trị từ hàm, bạn phải bao gồm câu lệnh trả về, theo sau là giá trị được trả về, trước câu lệnh kết thúc của hàm. If you do not include a return statement or if you do not specify a value after the keyword return, the value returned by the function is unpredictable.

Chủ Đề