Gọi một hàm bên trong một hàm khác #
Để gọi một hàm bên trong một hàm khác, hãy xác định hàm bên trong hàm bên ngoài và gọi nó. Khi sử dụng từ khóa function
, hàm được nâng lên trên cùng của phạm vi và có thể được gọi từ bất cứ nơi nào bên trong hàm bên ngoài.
Copied!
function outerFunc[a, b] { function innerFunc[a, b] { return a + b; } const result = innerFunc[a, b]; return result; } console.log[outerFunc[10, 10]]; // 👉️ 20 console.log[outerFunc[10, 20]]; // 👉️ 30
Ví dụ sau đây cho thấy cách chúng ta có thể gọi hàm bên trong trước khi được khai báo. Điều này là do cách nâng cao hoạt động trong JavaScript.
Copied!
function outerFunc[] { const num1 = 5; const num2 = 10; // 👇️ call inner function before it's declared const result = innerFunc[]; function innerFunc[] { return num1 + num2; } return result; } console.log[outerFunc[]]; // 👉️ 15
Điều này chỉ hoạt động cho các chức năng được khai báo bằng cách sử dụng từ khóa function
[không phải chức năng mũi tên].
Bạn có thể tưởng tượng rằng tuyên bố của hàm được nâng lên đỉnh của phạm vi, do đó nó có thể được gọi từ bất cứ nơi nào trong phạm vi.
Một cách tiếp cận khác là trả về hàm bên trong từ bên ngoài.
Copied!
function outerFunc[] { function innerFunc[a, b] { return a + b; } return innerFunc; } const innerFunc = outerFunc[]; console.log[innerFunc[2, 3]]; // 👉️ 5 console.log[innerFunc[3, 3]]; // 👉️ 6
Lưu ý rằng chúng tôi đã không sử dụng dấu ngoặc đơn []
để gọi hàm bên trong bên ngoài.
Chúng tôi đã trả lại chức năng mà không cần gọi nó. Nói cách khác, chúng tôi đã trả lại một tham chiếu đến hàm bên trong, không phải là kết quả của việc gọi nó.
Điều này cho phép chúng tôi gọi chức năng bên trong nhiều lần khi cần thiết, chuyển các tham số khác nhau mỗi lần.
Điều hữu ích nhất trong kịch bản này là hàm bên trong nhớ các biến được khai báo ở hàm bên ngoài giữa các lời mời.
Copied!
function outerFunc[] { const z = 100; function innerFunc[a, b] { return a + b + z; } return innerFunc; } const innerFunc = outerFunc[]; console.log[innerFunc[2, 3]]; // 👉️ 105 console.log[innerFunc[3, 3]]; // 👉️ 106
Lưu ý rằng hàm bên trong nhớ lại giá trị của biến z
giữa các lần gọi.
Khái niệm này được gọi là đóng cửa trong JavaScript.
Hàm bên trong được gói với các tài liệu tham khảo về trạng thái xung quanh.
Điều này có nghĩa là hàm bên trong có quyền truy cập vào các biến được khai báo bên trong phạm vi của hàm bên ngoài bất cứ lúc nào.
Điều này rất hữu ích trong nhiều kịch bản khác nhau. Ví dụ: bạn có thể chuyển một tham số cho hàm bên ngoài mà nó sẽ nhớ cho bất kỳ cuộc gọi hàm bên trong nào.
Copied!
function outerFunc[a] { function innerFunc[b, c] { return a + b + c; } return innerFunc; } const innerFunc = outerFunc[10]; console.log[innerFunc[1, 1]]; // 12 console.log[innerFunc[1, 2]]; // 13
Chúng tôi đã vượt qua 10
dưới dạng tham số cho hàm bên ngoài và lưu trữ kết quả trong một biến.
Biến
0 lưu trữ một tham chiếu đến hàmCopied!
function outerFunc[] { const num1 = 5; const num2 = 10; // 👇️ call inner function before it's declared const result = innerFunc[]; function innerFunc[] { return num1 + num2; } return result; } console.log[outerFunc[]]; // 👉️ 15
0, trong đó biếnCopied!
function outerFunc[] { const num1 = 5; const num2 = 10; // 👇️ call inner function before it's declared const result = innerFunc[]; function innerFunc[] { return num1 + num2; } return result; } console.log[outerFunc[]]; // 👉️ 15
2 trỏ đến giá trịCopied!
function outerFunc[] { const num1 = 5; const num2 = 10; // 👇️ call inner function before it's declared const result = innerFunc[]; function innerFunc[] { return num1 + num2; } return result; } console.log[outerFunc[]]; // 👉️ 15
10
.Bây giờ chúng ta có thể bỏ qua 10
từ các tham số khi gọi hàm bên trong.
Đọc thêm #
- Cách gọi hàm bên trong một đối tượng trong JavaScript
- Kiểm tra xem một hàm trả về một lời hứa trong JavaScript