Können Sie verschachtelte Funktionen in JavaScript schreiben?

116

Ich frage mich, ob JavaScript das Schreiben einer Funktion innerhalb einer anderen Funktion oder verschachtelter Funktionen unterstützt (ich habe sie in einem Blog gelesen). Ist das wirklich möglich? Tatsächlich habe ich diese verwendet, bin mir aber dieses Konzepts nicht sicher. Ich bin wirklich unklar - bitte helfen Sie!

Roter Schwan
quelle

Antworten:

197

Ist das wirklich möglich?

Ja.

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
quelle
23
Diese Methode wird als Currying bezeichnet.
Yekver
Entspricht dieser Code diesem?
Anne Ortiz
Funktion a (x) {// <- Funktionsrückgabe {calc: Funktion (y) {// <- innere Funktionsrückgabe x * y; // <- Rückgabe x Variablen aus dem äußeren Bereich verwenden}}; console.log (a (3) (4));
Anne Ortiz
29

Das Folgende ist böse, dient aber dazu zu demonstrieren, wie Sie Funktionen wie jede andere Art von Objekt behandeln können.

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
quelle
4
Tolles Beispiel. Ich möchte hinzufügen, dass es wichtig ist zu beachten, dass Funktionen, die in anderen Funktionen definiert sind, nur in diesem Funktionsbereich existieren (es sei denn, Sie weisen ihm gemäß diesem Beispiel natürlich eine globale Funktion zu).
Mike Sherov
5
Behandle diese Funktionen wie Objekte, die sie sind
Alex Lomia
17

Funktionen sind erstklassige Objekte, die sein können:

  • In Ihrer Funktion definiert
  • Wird wie jede andere Variable oder jedes andere Objekt an einem beliebigen Punkt Ihrer Funktion erstellt
  • Zurück von Ihrer Funktion (was nach den beiden oben genannten offensichtlich erscheint, aber immer noch)

Um auf dem Beispiel von Kenny aufzubauen:

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

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

Würde Sie mit 5 alarmieren.

cgp
quelle
5
Diese Methode wird als Currying bezeichnet.
Yekver
14

Ja, es ist möglich, eine in einer anderen Funktion verschachtelte Funktion zu schreiben und aufzurufen.

Versuche dies:

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

   }
}
user3261767
quelle
11

Sie können eine Funktion, die Sie als Variable an eine andere Funktion übergeben haben, nicht nur zurückgeben, sondern auch für die Berechnung innerhalb und außerhalb verwenden. Siehe dieses Beispiel:

    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
quelle
1
Ich benutze das mit
Ajax