Puoi scrivere funzioni annidate in JavaScript?


115

Mi chiedo se JavaScript supporti la scrittura di una funzione all'interno di un'altra funzione o funzioni annidate (l'ho letto in un blog). È davvero possibile? In effetti, ho usato questi ma non sono sicuro di questo concetto. Non sono davvero chiaro su questo - per favore aiutatemi!

Risposte:


196

È davvero possibile.

Sì.

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
Questo metodo si chiama curry.
Yekver

questo codice è equivalente a questo?
Anne Ortiz,

funzione a (x) {// <- funzione return {calc: funzione (y) {// <- funzione interna restituisce x * y; // <- restituisce x usa variabili dall'ambito esterno}}; console.log (a (3) (4));
Anne Ortiz,

29

Quanto segue è sgradevole, ma serve a dimostrare come puoi trattare le funzioni come qualsiasi altro tipo di oggetto.

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
Ottimo esempio. Vorrei aggiungere che è importante notare che le funzioni definite all'interno di altre funzioni esistono solo in tale ambito di funzioni (a meno che, ovviamente, non si assegni una funzione globale, come in questo esempio).
Mike Sherov

5
Tratta queste funzioni come oggetti che sono
Alex Lomia

17

Le funzioni sono oggetti di prima classe che possono essere:

  • Definito all'interno della tua funzione
  • Creato proprio come qualsiasi altra variabile o oggetto in qualsiasi punto della funzione
  • Restituito dalla tua funzione (che può sembrare ovvio dopo i due precedenti, ma comunque)

Per costruire sull'esempio fornito da Kenny:

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

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

Ti avviserebbe con 5.


5
Questo metodo si chiama curry.
Yekver

14

Sì, è possibile scrivere e chiamare una funzione annidata in un'altra funzione.

Prova questo:

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

   }
}

11

Non solo puoi restituire una funzione che hai passato in un'altra funzione come una variabile, puoi anche usarla per il calcolo all'interno ma definendolo all'esterno. Guarda questo esempio:

    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
Lo uso con ajax
jscripter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.