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!

Angsa Merah
sumber

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));

kennytm
sumber
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();
Quentin
sumber
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.

cgp
sumber
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(){

   }
}
pengguna3261767
sumber
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
Stefan Gruenwald
sumber
1
saya menggunakannya dengan ajax
jscripter