J'ai cherché SO pour cette question et ne semble pas la trouver: comment fonctionne un argument dans une fonction appelée directement à une fonction imbriquée? Par exemple, prenez le code suivant, à partir de "Eloquent Javascript:"

var dayName = function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return function(number) {
    return names[number];
  };
}();

console.log(dayName(3));
// → Wednesday

L'argument 3 est passé à dayName(), mais dayName() n'accepte aucun paramètre directement. Comment l'argument est-il transmis à la fonction renvoyée imbriquée? En quoi cela différerait-il si la fonction imbriquée n'a pas été renvoyée elle-même, mais a plutôt renvoyé une valeur?

Enfin, considérons ce pseudo-code, où deux arguments sont passés à la fonction dayName(), et la fonction dayName() et sa fonction imbriquée acceptent des paramètres:

var dayName = function(param) {
  console.log(param);
  (function(otherParam) {
    console.log(otherParam);
  });
};

dayName(outerFunctionParam, innerFunctionParam);

Quelle est la syntaxe appropriée pour passer un paramètre à la fonction dayName() et le deuxième paramètre à la fonction imbriquée, et comment cela fonctionne-t-il en arrière-plan? Merci!

0
Ivan Durst 8 mars 2016 à 06:36

4 réponses

Meilleure réponse

La chose est la parenthèse à la fin de l'affectation dayName. Lorsque le nom du jour se voit attribuer la parenthèse à la fin, la fonction renvoyée est affectée au nom du jour, et non à la fonction externe elle-même.

var a = function ( ) { 
    return 1;
}

var b = a; // the function a is assigned to b
var b = a(); // the function is executed hence the value returned by a is stored in b. That is 1

S'il vous plaît, jetez un oeil:

MISE À JOUR

var dayName = function(param1, param2) {
  console.log('param 1: ' + param1);
  (function(otherParam) {
    console.log('param 2: '+otherParam);
  })(param2);
};

dayName(1); // 1, undefined
dayName(1,2); // 1,2
1
Ivan Durst 8 mars 2016 à 04:31

Si nous réécrivons l'exemple sans fonction anonyme, cela ressemblera à ceci:

var theAnonymousFunction = function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return function(number) {
    return names[number];
  };
}; // no () here

var dayName = theAnonymousFunction();// call the anonymouse function to get a function(number) as returned object

console.log(dayName(3));
1
wan rui 8 mars 2016 à 03:52

C'est une excellente question! Il dépend du fait que la fonction dayName est une expression de fonction immédiatement invoquée (IFFE)

À cause de cela, il est immédiatement appelé.

Si vous prenez le (); à la fin de la fonction, comme ça, ça va fonctionner comme vous le pensez

var dayName = function() {
var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
           "Thursday", "Friday", "Saturday"];
  return function(number) {
  return names[number];
  };
}(); // take that '()' out and this function will just return a function
     // with it on, it Immediately calls the function, returning 'Wednesday'

JSBin fonctionnel: https://jsbin.com/zenajed/1/edit?js,console

1
omarjmh 8 mars 2016 à 03:48

La fonction dayName est une fermeture avec une variable privée. Vous accédez à ce tableau var via

return names[number];

De la fonction interne. Number est passé dans les noms pour déclarer la valeur du tableau à récupérer.

C'est essentiellement ce qui se passe

var dayName = function(number) {
    return names[number];
  };

La variable names est privée et n'est accessible que par la fonction. Ainsi, les noms de retour vont dans la fonction et saisissent cette variable pour utilisation.

Votre code.

var dayName = function() {
  var names = ["Sunday", "Monday", "Tuesday", "Wednesday",
               "Thursday", "Friday", "Saturday"];
  return function(number) {
    return names[number];
  };
}();

DEUXIÈME QUESTION.…………

Votre fonction dayName avec plusieurs paramètres n'utilisera que le premier paramètre car le second n'a jamais été déclaré dans la fonction. Vous obtiendrez une erreur non définie.

var dayName = function(param, otherParamNeedsToBeDeFinedHere) {

Les paramètres sont des variables qui sont déclarées et utilisées dans les fonctions. Vous pouvez en créer autant que possible mais vous n'avez pas besoin de les utiliser tous dans votre code.

dayName(2);
// and
dayName(2,4);

Les deux fonctionneront si la fonction a au moins deux paramètres.

Votre code.

var dayName = function(param) {
  console.log(param);
  (function(otherParam) {
    console.log(otherParam);
  });
};

dayName(outerFunctionParam, innerFunctionParam);
0
andre mcgruder 8 mars 2016 à 05:17