Trước JavaScript 1. 2, định nghĩa hàm chỉ được phép trong mã toàn cầu cấp cao nhất, nhưng JavaScript 1. 2 cũng cho phép các định nghĩa hàm được lồng trong các hàm khác. Tuy nhiên, có một hạn chế là định nghĩa hàm có thể không xuất hiện trong các vòng lặp hoặc điều kiện. Những hạn chế về định nghĩa hàm này chỉ áp dụng cho các khai báo hàm với câu lệnh hàm
Như chúng ta sẽ thảo luận sau trong chương tiếp theo, các ký tự hàm [một tính năng khác được giới thiệu trong JavaScript 1. 2] có thể xuất hiện trong bất kỳ biểu thức JavaScript nào, có nghĩa là chúng có thể xuất hiện trong if và các câu lệnh khác
Ví dụ
Hãy thử ví dụ sau để tìm hiểu cách triển khai các hàm lồng nhau
Click the following button to call the function
Use different parameters inside the function and then try...
đầu ra
Nói chung, việc xác định một hàm bên trong một hàm khác là để xác định phạm vi của nó đối với hàm đó và bạn không thể gọi một hàm lồng nhau trong JavaScript
function a[] {
function b[] {
alert['reached'];
}
}
Bạn phải làm một cái gì đó bên trong chức năng bên ngoài để làm cho chức năng bên trong có sẵn bên ngoài nó. Bạn sẽ cần trả về lời gọi hàm bên trong
function a[] {
function b[] {
alert['reached'];
}
return b[];
}
Và sau đó bạn có thể gọi hàm này đơn giản bằng cách gọi hàm
function a[] {
function b[] {
alert['reached'];
}
}
1 như thế nàya[];
Gọi hàm lồng nhau trong JavaScript
Mã ví dụ đơn giản gọi hàm b[] từ bên ngoài hàm a[]
function f1[] {
var c = 0;
function f2[] {
console.log[c++];
}
return f2;
}
var d = f1[];
d[];
d[];
d[];
var e = f1[];
e[];
e[];
đầu ra
Gọi hàm lồng nhau từ hàm bên ngoài
Bạn không thể gọi nó từ bất kỳ nơi nào khác trừ khi bạn làm cho nó khả dụng bằng cách nào đó, chẳng hạn bằng cách gán nó cho một thuộc tính trên đối tượng bạn đang tạo bằng cách gọi
function a[] {
function b[] {
alert['reached'];
}
}
2 qua function a[] {
function b[] {
alert['reached'];
}
}
3function batman[]{
this.hello = function[] {
console.log["hello world!"];
};
}
Hãy bình luận nếu bạn có bất kỳ nghi ngờ hoặc đề xuất nào về chủ đề hàm JS này
Ghi chú. Tất cả mã Ví dụ về JS đều được thử nghiệm trên trình duyệt Firefox và trình duyệt Chrome
hệ điều hành. cửa sổ 10
Mã số. Phiên bản HTML5
Rohit
Bằng cấp về Khoa học Máy tính và Kỹ sư. Nhà phát triển ứng dụng và có kinh nghiệm về nhiều ngôn ngữ lập trình. Đam mê công nghệ & thích học hỏi kỹ thuật
Nếu bạn muốn chạy innerFunction thì sao? . Tuy nhiên, bạn có thể đánh giá giá trị trả về của hàm ngoài như vậy
outerFunction[8][5] // returns 13
Nó hoạt động như thế nào? . Nếu bạn sử dụng nhiều cặp dấu ngoặc đơn, bạn đang yêu cầu Javascript chạy một thứ gì đó nhiều lần. Trong ví dụ của chúng tôi, dấu ngoặc đơn đầu tiên chạy hàm bên ngoài, hàm này trả về một hàm khác. hàm bên trong []. Sau đó, cặp dấu ngoặc đơn thứ hai chạy hàm bên trong, chuyển bất kỳ đối số nào từ hàm ngoài sang hàm bên trong
outerFunction[8][5] // The first [] returns innerFunction but doesn't run innerFunction. The second [] runs innerFunction and passes innerFunction arguments 8 and 5. InnerFunction[] then returns 13.
Nếu bạn có một số chức năng lồng nhau thì sao?
Chạy outsideFunction[] sẽ trả về một đối tượng chứa tham chiếu đến 3 hàm. Việc chạy outsideFunction[][] sẽ đưa ra một ngoại lệ vì bạn trả về một đối tượng trong lần đánh giá đầu tiên ["[]" đầu tiên] và các đối tượng không thể được gọi hoặc chạy dưới dạng các hàm. Đánh giá thứ hai ["[]"] thứ hai sẽ cố chạy đối tượng như thể nó là một hàm.. nhưng các đối tượng không phải là hàm nên bạn gặp lỗi
Vậy làm thế nào để chúng ta chạy một trong các chức năng lồng nhau đó?
outerFunction[8].innerFunction[5] // returns 13
Như với bất kỳ đối tượng nào trong Javascript, bạn có thể sử dụng ký hiệu dấu chấm để lấy giá trị của bất kỳ khóa nào trong đối tượng. Trong trường hợp này, chúng tôi đã chỉ định InternalFunction sau đó thêm [] để thực sự chạy InternalFunction
Lưu ý rằng đối tượng được trả về bởi outsideFunction[] không bao gồm privateFunction[]
function a[] {
function b[] {
alert['reached'];
}
}
0Điều này có nghĩa là chúng ta không bao giờ có thể gọi trực tiếp privateFunction[]. privateFunction[] bị khóa trong một bao đóng và chỉ có thể được sử dụng từ bên trong outsideFunction[]