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!

Cygne rouge
la source

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

KennyTM
la source
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();
Quentin
la source
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.

cgp
la source
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(){

   }
}
user3261767
la source
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
Stefan Gruenwald
la source
1
J'utilise