web-dev-qa-db-fra.com

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

Je me demande si JavaScript prend en charge l'écriture d'une fonction dans une autre fonction ou de fonctions imbriquées (je l'ai lue dans un blog). Est-ce vraiment possible? En fait, j'ai utilisé ceux-ci mais je ne suis pas sûr de ce concept. Je ne suis vraiment pas clair sur ceci - aide s'il vous plaît!

99
Red Swan

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

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

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

  • Défini dans votre fonction
  • Créé comme n'importe quelle autre variable ou objet à n'importe quel moment de votre fonction
  • Retour de votre fonction (ce qui peut sembler évident après les deux précédentes, mais quand même)

Pour reprendre 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 alerterais avec 5.

15
cgp

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

   }
}
12
user3261767

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