2009-06-11 8 views
1

J'ai la situation suivante en JavaScript:Comment puis-je appeler une fonction anonyme (stockée dans une chaîne) avec un argument en JavaScript?

<a onclick="handleClick(this, {onSuccess : 'function() { alert(\'test\') }'});">Click</a> 

La fonction handleClick reçoit le second argument comme un objet avec une propriété onSuccess contenant la définition de fonction ...

Comment appeler la fonction onSuccess (qui est stocké sous forme de chaîne) -et-passer otherObject à cette fonction? (solution jQuery aussi bien ...)?

C'est ce que je l'ai essayé jusqu'à présent ...

function handleClick(element, options, otherObject) { 
    options.onSuccess = 'function() {alert(\'test\')}'; 

    options.onSuccess(otherObject); //DOES NOT WORK 
    eval(options.onSuccess)(otherObject); //DOES NOT WORK 
} 

Répondre

6

Vous avez vraiment pas besoin de le faire. Passez la fonction autour d'une chaîne, je veux dire. fonctions JavaScript sont des objets de première classe, et peuvent être passés autour directement:

<a onclick="handleClick(this, {onSuccess : function(obj) { alert(obj) }}, 'test');"> 
    Click 
</a> 

...

function handleClick(element, options, otherObject) { 
    options.onSuccess(otherObject); // works... 
} 

Mais si vous vraiment voulez le faire votre chemin, puis cloudhead's solution fera tout bien.

+0

bah ... et là j'étais en train d'écrire mon exposition sur la portée d'eval. +1 pour répondre à la vraie question – Jimmy

+0

Ouais j'ai fini par faire ça, mais cela signifie que je ne peux plus utiliser le json_encode en PHP ... cela encapsule tout dans les chaînes .. – Ropstah

+2

@ropstah: je ne sais pas pourquoi vous essayez de passer les définitions de fonctions via JSON. .. À moins que vous ne génériez réellement ces fonctions à la volée, côté serveur, vous voudrez peut-être envisager de constituer une bibliothèque de fonctions et de simplement les * nommer * dans le JSON. Vous pouvez alors rechercher la fonction que vous voulez sans vous soucier de eval() – Shog9

1

Essayez ceci:

options.onSuccess = eval('function() {alert(\'test\')}'); 
options.onSuccess(otherObject); 
+0

est-ce pas la même chose que: eval ('function() {alert (\' test \ ')} ') (autre objet); – Ropstah

+0

Comme le note Itay, vous voudrez mettre entre parenthèses le paramètre eval ('(' + options.onSuccess + ')') - sinon, FF s'étrangle. Désolé, j'ai oublié ça ... – Shog9

0

Il ne fonctionnait que sur mon FF quand j'ai ajouté un assignmnet dans une variable fictive:

options.onSuccess = 'dummyVariable = function(x) {alert("x=" + x);}'; 
f = eval(options.onSuccess); 
f(5); 
+0

Heh, bonne prise. Mais plutôt que d'introduire dummyVariable, vous pouvez simplement envelopper la valeur entre parenthèses. – Shog9

Questions connexes