¿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!

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


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

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.


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

   }
}

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

1
lo uso con ajax
jscripter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.