178 votes

Curry de JavaScript - quelles sont les applications pratiques ?

Je ne pense pas que j'ai grokked nourrissage encore. Je comprends ce qu'il fait et comment le faire. Je ne peux pas penser à une situation que je voudrais l'utiliser.

Où en êtes-vous à l'aide de nourrissage en javascript (ou où se trouvent les principales bibliothèques de l'utiliser)? Manipulation du DOM ou d'application générale exemples de développement de bienvenue.

EDIT: Une des réponses mentionne l'animation. Des fonctions comme "slideUp", "fadeIn" prendre un élément que l'un des arguments et sont normalement un curry de fonction de retour de l'ordre élevé de la fonction avec la valeur par défaut "la fonction d'animation" built-in. Pourquoi est-ce mieux que de simplement l'application la plus élevée de la fonction avec des valeurs par défaut?

Oh et il y a des inconvénients à utiliser?

Des acclamations.

EDIT: Comme l'a demandé voici quelques bonnes ressources sur le javascript lancer:

Je vais ajouter d'autres cultures dans les commentaires.


EDIT:

Merci pour les réponses.

Afin de nourrissage et l'application partielle en général sont la commodité des techniques.

Si vous êtes fréquemment de "raffinage" de haut niveau de la fonction en l'appelant avec la même configuration, vous pouvez curry (ou de l'utilisation Resig partielle) au plus haut niveau de la fonction à créer simple, concis et méthodes d'assistance.

Cheers!

115voto

Prisoner ZERO Points 3105

37voto

Hank Gay Points 36173

@Hank Gay

En réponse à EmbiggensTheMind commentaire:

Je ne peux pas penser à une instance où nourrissageen soi est utile en JavaScript; c'est une technique pour convertir les appels de fonction à plusieurs arguments dans les chaînes d'appels de fonction avec un argument simple pour chaque appel, mais JavaScript prend en charge plusieurs arguments dans un seul appel de fonction.

En JavaScript-et je suppose que la plupart des autres langues (pas de lambda calcul)-il est communément associé à une application partielle. John Resig explique mieux, mais l'essentiel est qu'à une certaine logique qui sera appliquée à deux arguments ou plus, et vous n'en connaissez la valeur(s) pour certains de ces arguments.

Vous pouvez utiliser l'application partielle/nourrissage pour corriger les valeurs connues et de retour d'une fonction qui accepte uniquement les inconnues, à invoquer plus tard, quand vous avez réellement les valeurs que vous souhaitez transmettre. Cela fournit une manière astucieuse pour éviter de vous répéter lorsque vous aurait été d'appeler la même JavaScript built-ins plus et plus avec tous les mêmes valeurs, mais un. Pour voler John's exemple:

String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( (results[1] == "Resig") + " The text values were split properly" );

7voto

Armin Ronacher Points 16894

J'ai trouvé des fonctions qui ressemblent à python functools.partial plus utile en JavaScript:

function partial(fn) {
  return partialWithScope.apply(this,
    Array.prototype.concat.apply([fn, this],
      Array.prototype.slice.call(arguments, 1)));
}

function partialWithScope(fn, scope) {
  var args = Array.prototype.slice.call(arguments, 2);
  return function() {
    return fn.apply(scope, Array.prototype.concat.apply(args, arguments));
  };
}

Pourquoi voudriez-vous utiliser? Une situation commune où vous souhaitez l'utiliser c'est quand vous voulez lier this dans une fonction à une valeur:

var callback = partialWithScope(Object.function, obj);

Maintenant, quand le rappel est appelée, this points de obj. Ceci est utile dans les cas de situations ou d'économiser de l'espace parce qu'il se rend le code plus court.

Nourrissage est similaire à l'partielle avec la différence que la fonction du nourrissage retourne juste à accepte un seul argument (comme je le comprends).

2voto

Marijn Points 752

Il n’est pas de magie ou quoi que ce soit... juste un raccourci agréable pour des fonctions anonymes.

partielle (alerte, "FOO !") est équivalent à function(){alert("FOO!") ;}

partielle (Math.max, 0) correspond au function {return Math.max (0, x) ;}

Les appels à partielle (MochiKit terminologie. Je pense que donnent à d’autres bibliothèques de fonctions une méthode .curry qui fait la même chose) regarder un peu plus agréable et moins bruyant que les fonctions anonymes.

1voto

William Pietri Points 1401

Voici un exemple.

Je suis instrumentant d'un tas de champs avec JQuery afin que je puisse voir ce que les utilisateurs sont à la hauteur. Le code ressemble à ceci:

$('#foo').focus(trackActivity);
$('#foo').blur(trackActivity);
$('#bar').focus(trackActivity);
$('#bar').blur(trackActivity);

(Pour les non-JQuery utilisateurs, je suis en train de dire que toutes les fois qu'un couple de champs d'obtenir ou de perdre le focus, je veux le trackActivity() fonction qui doit être appelée. Je pourrais aussi utiliser une fonction anonyme, mais je dois dupliquer 4 fois, donc je l'ai sorti et l'a nommé.)

Maintenant, il s'avère que l'un de ces champs doit être traitée différemment. Je aimerais être en mesure de passer un paramètre sur l'un de ces appels à passer, à notre infrastructure de suivi. Avec nourrissage, je peux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X