Bạn có thể viết các hàm lồng nhau trong JavaScript không?


116

Tôi đang tự hỏi liệu JavaScript hỗ trợ viết một hàm trong một hàm khác hay các hàm lồng nhau (tôi đọc nó trong blog). Điều này có thực sự khả thi không ?. Trong thực tế, tôi đã sử dụng chúng nhưng không chắc chắn về khái niệm này. Tôi thực sự không rõ ràng về điều này - xin vui lòng giúp đỡ!

Câu trả lời:


197

Điều này có thực sự khả thi không.

Đúng.

function a(x) {    // <-- function
  function b(y) { // <-- inner function
    return x + y; // <-- use variables from outer scope
  }
  return b;       // <-- you can even return a function.
}
console.log(a(3)(4));


23
Phương pháp này được gọi là cà ri.
Yekver

là mã này tương đương với cái này?
Anne Ortiz

function a (x) {// <- function return {calc: function (y) {// <- Hàm bên trong return x * y; // <- Hàm return x sử dụng các biến từ phạm vi bên ngoài}}; console.log (a (3) (4));
Anne Ortiz

29

Sau đây là khó chịu, nhưng phục vụ để chứng minh cách bạn có thể coi các hàm giống như bất kỳ loại đối tượng nào khác.

var foo = function () { alert('default function'); }

function pickAFunction(a_or_b) {
    var funcs = {
        a: function () {
            alert('a');
        },
        b: function () {
            alert('b');
        }
    };
    foo = funcs[a_or_b];
}

foo();
pickAFunction('a');
foo();
pickAFunction('b');
foo();

4
Ví dụ tuyệt vời. Tôi muốn nói thêm rằng điều quan trọng cần lưu ý là các hàm được định nghĩa bên trong các hàm khác chỉ tồn tại trong phạm vi hàm đó (tất nhiên trừ khi bạn gán một hàm toàn cục cho nó, theo ví dụ này).
Mike Sherov,

5
Hãy đối xử với những chức năng như đối tượng họ
Alex Lomia

17

Các hàm là các đối tượng lớp đầu tiên có thể là:

  • Được xác định trong chức năng của bạn
  • Được tạo giống như bất kỳ biến hoặc đối tượng nào khác tại bất kỳ điểm nào trong hàm của bạn
  • Được trả về từ chức năng của bạn (điều này có vẻ hiển nhiên sau hai điều trên, nhưng vẫn vậy)

Để xây dựng dựa trên ví dụ do Kenny đưa ra:

   function a(x) {
      var w = function b(y) {
        return x + y;
      }
      return w;
   };

   var returnedFunction = a(3);
   alert(returnedFunction(2));

Sẽ cảnh báo bạn với 5.


5
Phương pháp này được gọi là cà ri.
Yekver

14

Có, có thể viết và gọi một hàm lồng trong một hàm khác.

Thử cái này:

function A(){
   B(); //call should be B();
   function B(){

   }
}

11

Bạn không chỉ có thể trả về một hàm mà bạn đã truyền vào một hàm khác dưới dạng một biến, bạn cũng có thể sử dụng nó để tính toán bên trong nhưng định nghĩa nó bên ngoài. Xem ví dụ này:

    function calculate(a,b,fn) {
      var c = a * 3 + b + fn(a,b);
      return  c;
    }

    function sum(a,b) {
      return a+b;
    }

    function product(a,b) {
      return a*b;
    }

    document.write(calculate (10,20,sum)); //80
    document.write(calculate (10,20,product)); //250

1
Tôi sử dụng cái đó với ajax
jscripter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.