Quel est l'avantage d'attribuer une fonction à un var?

10

Compte tenu de cet exemple Javascript que j'ai trouvé

var sum = function() {
  var i, sum = 0;
  for(i = 0; i < arguments.length; i += 1) {
    sum += arguments[i];
  }
  return sum;
};

Quel avantage y a-t-il à assigner une fonction à un var?

octopusgrabbus
la source
stackoverflow.com/questions/336859
BlueRaja - Danny Pflughoeft

Réponses:

8

La réponse courte, je crois, est simplement que vous créez une fonction anonyme affectée à une variable, par opposition à la création d'une fonction nommée avec ...

    function sum() {}

Un bon moyen de vérifier les différences est d'appeler .ToString () sur eux et de voir la différence ou vous pouvez faire console.log (sum.name). L'un donnera un nom réel et l'autre rien, à savoir la fonction anonyme (celle attribuée à la var). Il y a aussi des spécificités, comme la var sum = function () {} est définie au moment de l'exécution et la fonction sum () {} est définie au moment de l'analyse.

harmonickey
la source
Ce que je veux dire par la dernière phrase, c'est que si vous essayez d'appeler sum () dans une ligne précédente au-dessus où il a été défini par var, alors il y aurait une erreur. S'il est défini comme dans ma réponse, il n'y aurait pas d'erreur, même si l'appel était au-dessus de la fonction.
harmonickey
12
Cela explique la différence , mais je ne pense pas que cela explique l' avantage .
Keith Thompson
quelle est la différence entre le temps d'analyse et le temps d'exécution?
Wern Ancheta
1
N'a rien à voir avec les fonctions nommées, vous pouvez toujours assigner une fonction nommée à une variable
Juan Mendes
5

Un avantage est que vous ne pouvez pas utiliser une déclaration de fonction dans un bloc. Ils ne peuvent se trouver qu'au niveau supérieur d'un fichier ou directement dans une autre fonction.

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Ceux-ci ne sont pas tous spécifiés par la norme et les navigateurs font des choses différentes, voir /programming/10069204/function-declarations-inside-if-else-statements . Donc, si vous devez parfois utiliser l'autre style, pour des raisons de cohérence, vous pouvez toujours le faire

De plus, je ne suis pas sûr de celui-ci, mais si je me souviens bien, certains anciens minificateurs n'étaient pas assez intelligents pour gérer les déclarations de fonctions et ne les renomment pas.

Austin
la source
3

Je ne suis pas un expert Javascript, alors prenez ceci avec un grain de sel. Je pense que dans certains cas, les gens pourraient le faire pour le style et la même chose pourrait être réalisée en écrivant simplement "function sum () {...}"

Cependant, assigner une fonction à une variable est une technique très puissante en programmation fonctionnelle. Si vous connaissez la POO, elle est quelque peu similaire au polymorphisme. Pensez à l'exemple classique de la classe de base animale et des classes dérivées chat / chien. Vous pouvez écrire du code qui fonctionne avec Animal mais quand il appelle une fonction, cette fonction peut faire un travail différent selon le type d'une instance.

En programmation fonctionnelle, vous pourriez avoir un algorithme qui fonctionne avec "une fonction" mais si vous utilisez une variable pour appeler cette fonction, vous avez la possibilité d'affecter une fonction différente au moment de l'exécution.

Par exemple, supposons que vous écriviez un algorithme pour présenter 10 000 points de données dans une fenêtre de 500 pixels seulement. Chaque pixel représentera alors 20 points de données et afin de les présenter, vous devez agréger ces 20 points de données en une seule valeur.

Supposons donc que vous définissiez un algorithme pour présenter les 10 000 points et que cet algorithme utilise une variable de fonction appelée agrégat comme ceci:

...
displayValue = aggregate( numbersInOnePixel );
...

Désormais, au moment de l'exécution, votre utilisateur peut sélectionner le mode d'agrégation des données. Votre variable de fonction réelle peut être l'une des suivantes:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
DXM
la source
0

C'est surtout une question de style, car les seules situations où la différence apparaît (appeler certaines des fonctions avant de mettre fin à toutes les déclarations; en utilisant la méthode toString) sont à mon avis des cas de coin.

L'un des arguments que j'ai entendu à l'appui de ce var =style est qu'il est cohérent avec la façon dont vous déclarez les variables normales. Cela limite le nombre de fonctionnalités de langage que vous utilisez et simplifie la production de votre programme à quelqu'un de nouveau pour Javascript.

hugomg
la source