Pouvez-vous écrire des fonctions imbriquées en JavaScript?


115

Je me demande si JavaScript prend en charge 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, je les ai utilisés mais je ne suis pas sûr de ce concept. Je ne suis vraiment pas clair à ce sujet - aidez s'il vous plaît!

Réponses:


196

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


23
Cette méthode s'appelle le curry.
Yekver

ce code est-il équivalent à celui-ci?
Anne Ortiz

function a (x) {// <- function return {calc: function (y) {// <- internal function return x * y; // <- return x use variables from external scope}}; console.log (a (3) (4));
Anne Ortiz

29

Ce qui suit est désagréable, mais sert à montrer comment vous pouvez traiter les fonctions comme tout 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();

4
Excellent exemple. J'ajouterais qu'il est important de noter que les fonctions définies dans d'autres fonctions n'existent que dans cette portée de fonctions (à moins, bien sûr, que vous ne lui affectiez une fonction globale, comme dans cet exemple).
Mike Sherov

5
Traitez ces fonctions comme des objets qu'elles sont
Alex Lomia

17

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

  • Défini au sein de votre fonction
  • Créé comme n'importe quelle autre variable ou objet à tout moment de votre fonction
  • Revenu de votre fonction (ce qui peut sembler évident après les deux ci-dessus, mais quand même)

Pour construire sur 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));

Vous alerterait avec 5.


5
Cette méthode s'appelle le curry.
Yekver

14

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

Essaye ça:

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

   }
}

11

Non seulement vous pouvez renvoyer une fonction que vous avez passée dans une autre fonction en tant que variable, vous pouvez également l'utiliser pour le calcul à l'intérieur mais en la 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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.