Bisakah Anda menulis fungsi bertingkat di JavaScript?


116

Saya bertanya-tanya apakah JavaScript mendukung penulisan fungsi dalam fungsi lain, atau fungsi bersarang (saya membacanya di blog). Apakah ini benar-benar mungkin ?. Sebenarnya, saya telah menggunakan ini tetapi saya tidak yakin dengan konsep ini. Saya benar-benar tidak jelas tentang ini - tolong bantu!

Jawaban:


197

Apakah ini benar-benar mungkin.

Iya.

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
Cara ini disebut kari.
Yekver

apakah kode ini sama dengan yang ini?
Anne Ortiz

fungsi a (x) {// <- fungsi kembali {kalk: fungsi (y) {// <- fungsi bagian dalam kembali x * y; // <- kembali x menggunakan variabel dari ruang lingkup luar}}; console.log (a (3) (4));
Anne Ortiz

29

Berikut ini adalah hal yang buruk, tetapi berfungsi untuk menunjukkan bagaimana Anda dapat memperlakukan fungsi seperti jenis objek lainnya.

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
Contoh yang bagus. Saya akan menambahkan bahwa penting untuk dicatat bahwa fungsi yang didefinisikan di dalam fungsi lain hanya ada dalam lingkup fungsi itu (kecuali, tentu saja, Anda menetapkan fungsi global untuk itu, sesuai contoh ini).
Mike Sherov

5
Perlakukan fungsi tersebut seperti objek
Alex Lomia

17

Fungsi adalah objek kelas satu yang dapat berupa:

  • Didefinisikan dalam fungsi Anda
  • Dibuat seperti variabel atau objek lain di titik mana pun dalam fungsi Anda
  • Dikembalikan dari fungsi Anda (yang mungkin tampak jelas setelah dua di atas, tapi tetap saja)

Untuk membangun contoh yang diberikan oleh Kenny:

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

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

Akan mengingatkan Anda dengan 5.


5
Cara ini disebut kari.
Yekver

14

Ya, dimungkinkan untuk menulis dan memanggil fungsi yang bertumpuk di fungsi lain.

Coba ini:

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

   }
}

11

Anda tidak hanya dapat mengembalikan fungsi yang telah Anda berikan ke fungsi lain sebagai variabel, Anda juga dapat menggunakannya untuk kalkulasi di dalam tetapi juga menentukannya di luar. Lihat contoh ini:

    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
saya menggunakannya dengan ajax
jscripter
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.