¿Puedes escribir funciones anidadas en JavaScript?

116

Me pregunto si JavaScript admite la escritura de una función dentro de otra función o funciones anidadas (lo leí en un blog). ¿Es esto realmente posible ?. De hecho, los he usado pero no estoy seguro de este concepto. Realmente no tengo claro esto, ¡por favor ayuda!

Cisne rojo
fuente

Respuestas:

197

¿Es esto realmente posible?

Si.

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
fuente
23
Este método se llama curry.
Yekver
¿Es este código equivalente a este?
Anne Ortiz
function a (x) {// <- function return {calc: function (y) {// <- función interna return x * y; // <- return x usa variables del alcance externo}}; console.log (a (3) (4));
Anne Ortiz
29

Lo siguiente es desagradable, pero sirve para demostrar cómo puede tratar funciones como cualquier otro tipo de objeto.

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
fuente
4
Gran ejemplo. Agregaría que es importante tener en cuenta que las funciones definidas dentro de otras funciones solo existen en ese alcance de funciones (a menos que, por supuesto, le asigne una función global, según este ejemplo).
Mike Sherov
5
Trate esas funciones como objetos que son
Alex Lomia
17

Las funciones son objetos de primera clase que pueden ser:

  • Definido dentro de su función
  • Creado como cualquier otra variable u objeto en cualquier punto de su función
  • Regresó de su función (lo que puede parecer obvio después de los dos anteriores, pero aún así)

Para construir sobre el ejemplo dado por Kenny:

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

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

Le avisaría con 5.

cgp
fuente
5
Este método se llama curry.
Yekver
14

Sí, es posible escribir y llamar a una función anidada en otra función.

Prueba esto:

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

   }
}
user3261767
fuente
11

No solo puede devolver una función que ha pasado a otra función como variable, también puede usarla para el cálculo dentro pero para definirla fuera. Vea este ejemplo:

    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
fuente
1
lo uso con ajax
jscripter