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!

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


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

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.


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

   }
}

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

1
Ich benutze das mit
Ajax
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.