2009-10-19 7 views
8

Récemment, j'ai vu ce morceau de code JavaScript, mais j'ai été incapable de comprendre ce qu'il essaie de faire.Que fait "return function() {...}" en JavaScript?

var f = function(a) { 
    return function() { 
     alert(a()); 
    }; 
}; 
f(function() { return "Hello World"; })(); 

S'il vous plaît expliquer ce que cela accomplit!

+0

** downvote **: D parce que ce n'est pas si difficile que je pensais? –

+0

** upvote ** - parce que les fonctions de premier ordre, et en particulier l'invocation de la fonction renvoyée par un appel de fonction (par exemple 'f()()') * semble vraiment confuse jusqu'à ce que vous l'obteniez. –

+0

Félicitations, Rakesh Juyal! Vous venez de tomber sur la programmation fonctionnelle! Je me sens si heureux pour vous * sob * –

Répondre

9

il exécute la fonction f rendements.
f renvoie une fonction qui appelle une alerte qui affiche la sortie de la fonction que vous avez donnée comme paramètre à f.

EDIT: substituer Juste quelques pièces pour le rendre plus facile sur l'oeil et vous verrez vous-même:

var f = function(a) { 
    var output = a(); 
    var alertCaller = function() { 
     alert(output); 
    }; 
    return alertCaller; 
}; 

var helloWorld = function() { return "Hello World"; } 
var result = f(helloWorld); //f takes a function as argument 
result(); //result must be a function 
+0

mox, probablement vous avez raison, mais allez-vous s'il vous plaît expliquer. –

+1

'f' * est une fonction. – nickf

+0

F est une fonction qui accepte une fonction (par exemple * arg1 *) et renvoie une fonction qui affichera la valeur renvoyée par la fonction * arg1 *? Est-ce correct ? –

3

Il est un moyen très compliqué d'obtenir un message d'alerte pour afficher « Bonjour tout le monde ». Les fonctions sont des éléments de première classe dans javascript, et peuvent être transférés vers et à partir d'autres fonctions en tant que paramètres.

2

Ce code crée un générateur de fonctions. La première fonction (dont la référence est stockée dans f) accepte une référence à une autre fonction (a). Ensuite f crée une fonction qui se ferme sur le paramètre a et renvoie une référence à la nouvelle fonction qui alerte la valeur de retour de a's résultat invoqué.

Enfin ce désordre est appelé avec une fonction inline et son résultat est immédiatement invoqué (avec les parenthèses ouvrantes et fermantes à la fin).

6

Il est juste une fonction de niveau supérieur, qui dans ce cas est pas vraiment nécessaire.

f est une fonction qui prend une autre fonction (appelée a) et retours une fonction nouvellement généré qui évaluera a et affiche un message d'alerte indiquant le résultat. Donc, la ligne du bas appelle f (passant dans une fonction anonyme qui imprime "Hello World"), puis évalue immédiatement la fonction anonyme retournée par f - qui évaluera l'argument passé (que vous pouvez voir retourne "Hello World") ") puis ouvre une boîte d'alerte.

Le code affiché est fonctionnellement équivalent à

alert("Hello World"); 

mais il y a deux éléments supplémentaires qui le rendent plus complexe:

  1. Vous pouvez passer une fonction arbitraire afin de générer la chaîne qui apparaît dans la boîte d'alerte (et cela sera évalué paresseusement, ce qui pourrait être important - par exemple, une fonction pour imprimer le temps actuel/statut de l'application/utilisation de la mémoire lorsque l'alerte est affichée r plus que lorsque la méthode a été créée).
  2. Vous pouvez générer une fermeture qui affichera cette alerte, puis la passera au lieu de l'exécuter immédiatement.

Mais comme aucun de ces avantages n'est réellement utilisé dans l'extrait de code, je peux voir pourquoi vous seriez confus.

+0

+1 pour un essai intéressant –

0

f est affecté une fonction qui prend une fonction comme argument, l'invoque et affiche sa valeur de retour dans un alert. Puis f est appelée avec une fonction qui renvoie la chaîne "Hello World" lorsqu'elle est invoquée, entraînant l'affichage de Hello World dans une alerte.