2010-02-10 4 views
5

Je dois souvent lier? une fonction qui nécessite des arguments. La solution que j'utilise enveloppe la fonction pour lier à l'intérieur d'une fonction anonyme.Javascript empêche la fonction anonyme?

function foo(arg_0) { 
    // do stuff with: arg_0 
} 

function bar() { 
    var abc; 
    // stuff happens 
    abc = 'some value'; 
    attachEventHandler(elementId, 'click', function(){foo(abc);}); 
} 
bar(); 

Y at-il une façon plus élégante de le faire?

+0

Votre syntaxe est erronée; vous vouliez dire 'function() {foo (abc); }) ' – SLaks

+0

Merci, changé – Jacco

Répondre

10

Vous pouvez faire un curryer, comme ceci:

function curry(func) { 
    var functionArgs = Array.prototype.slice.call(arguments, 1); 
    return function() { return func.apply(this, functionArgs); }; 
} 

Utilisation:

attachEventHandler(elementId, 'click', curry(foo, abc)); 

Autre possibilité:

Function.prototype.curry = function() { 
    var func = this, functionArgs = arguments; 
    return function() { return func.apply(this, functionArgs); }; 
} 

Utilisation:

attachEventHandler(elementId, 'click', foo.curry(abc)); 
+2

bonne idée, merci +1 –

+0

Faut-il épeler currier? – SLaks

+0

Je n'aurais jamais pensé que JavaScript commencerait à me donner faim ... –

-2

vous pouvez même prendre regarder quelques-uns js libs

par exemple YUI

ce que vous faites

YUI().use('node',function(Y){ 
    Y.one("#elementID").on('click', function(){ 
    // do your stuff here 
    }); 
}); 
+0

Cela ne répond pas à la question. – SLaks

1

C'est très bien. Ce que vous avez est essentiellement l'utilisation d'un callback ou "délégué".

Le curry de SLaks est un bon sucre syntaxique si vous devez le faire souvent dans un script.

0

Donc dans votre code vous avez une fonction foo() qui prend un événement comme argument? Si c'est tout ce que vous voulez faire alors votre attachEventHandler() peut être écrit comme:

attachEventHandler(elementId, 'click', foo); 

Qu'est-ce qui se passe là-bas est qu'au lieu de appeler foo() il est le passage d'une référence à foo().

Est-ce plus proche de ce que vous pensez?

+0

Il semble essayer de modifier les paramètres; Je crois que le paramètre 'abc' dans sa méthode anonyme n'est là que par erreur. – SLaks

1

Vous pouvez masquer la fonction mot si vous préférez 'curry', mais votre méthode d'origine fait la même chose sans la surcharge.

Vous n'avez pas besoin de l'argument entre parenthèses dans la Fonction- anonyme il est toujours portée lorsque vous définissez it-

abc = 'some value'; 
attachEventHandler(elementId, 'click', function(abc){foo(abc);}) 
could be: 
attachEventHandler(elementId, 'click', function(){foo(abc)}); 
+0

En fait, mettre l'argument entre parenthèses n'est pas le même.Son code d'origine (avant d'éditer la question) passait l'objet événement qui est donné à la fonction anonyme à 'foo'. – SLaks

+0

Cette question ne concernait pas la transmission d'un événement, donc, dans ce cas votre réponse est sur place. Si je devais passer un événement, la première solution serait différente de la seconde. – Jacco

Questions connexes