2010-07-09 6 views
71

Je me demande si JavaScript supporte l'écriture d'une fonction dans une autre fonction, ou des fonctions imbriquées (je l'ai lu dans un blog). Est-ce vraiment possible? En fait, j'ai utilisé ces derniers mais je ne suis pas sûr de ce concept. Je ne suis pas très clair à ce sujet - s'il vous plaît aider!Pouvez-vous écrire des fonctions imbriquées en JavaScript?

Répondre

142

Est-ce vraiment possible.

Oui.

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

Cette méthode est appelée "exécution". – Yekver

+29

Woh! J'ai besoin de sédation après avoir vu ça! –

24

Ce qui suit est méchant, mais sert à démontrer comment vous pouvez traiter des fonctions comme n'importe quel autre type d'objet.

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

grand exemple. J'ajouterais qu'il est important de noter que les fonctions définies à l'intérieur d'autres fonctions n'existent que dans cette étendue de fonctions (à moins, bien sûr, que vous lui assigniez une fonction globale, comme dans cet exemple). –

+2

Traitez ces fonctions comme des objets –

11

Les fonctions sont des objets de première classe qui peuvent être:

  • Définie au sein de votre fonction
  • Créé comme toute autre variable ou un objet à tout moment dans votre fonction
  • Retourné de votre fonction (ce qui peut sembler évident après les deux ci-dessus, mais toujours)

Pour construire l'exemple donné par Kenny:

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

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

Est-ce que vous alertera avec 5.

+2

Cette méthode est appelée currying. – Yekver

7

Non seulement pouvez-vous retourner une fonction que vous avez passé dans une autre fonction comme variable, vous pouvez également l'utiliser pour le calcul à l'intérieur mais en le définissant à l'extérieur. Voir cet exemple:

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

je l'utilise avec ajax – jscripter

9

Oui, il est possible d'écrire et d'appeler une fonction imbriquée dans une autre fonction.

Essayez ceci:

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

    } 
}