2010-07-09 24 views
71

Me pregunto si JavaScript admite escribir 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. No estoy muy claro sobre esto, ¡por favor ayuda!¿Puedes escribir funciones anidadas en JavaScript?

Respuesta

142

¿Es esto realmente posible.

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

+11

Este método se llama currying. – Yekver

+29

Woh! ¡Necesito sedación después de ver esto! –

24

Lo siguiente es desagradable, pero sirve para demostrar cómo se pueden tratar las 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(); 
+3

gran ejemplo. Añadiría que es importante tener en cuenta que las funciones definidas dentro de otras funciones solo existen en ese ámbito de funciones (a menos que, por supuesto, le asigne una función global, como se muestra en este ejemplo). –

+2

Trate esas funciones como objetos que son –

11

Las funciones son objetos de primera clase que pueden ser:

  • definido dentro de su función
  • Creado al igual que cualquier otra variable u objeto en cualquier punto de su función
  • Devuelto desde su función (que puede parecer obvio después de los dos anteriores, pero aún así)

basarse en 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á con 5.

+2

Este método se llama currying. – Yekver

7

No sólo se puede devolver una función que ha pasado a otra función como una variable, también puede usarlo para el cálculo dentro pero definiéndolo afuera. 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

9

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

    } 
} 
Cuestiones relacionadas