2013-03-13 4 views
0

J'ai des problèmes pour appeler une fonction avec params, où le nom de la fonction est stocké dans une variable. J'ai utilisé .call et .apply pour essayer d'appeler la fonction, mais je n'ai pas eu beaucoup de succès.javascript .apply avec le nom de la fonction variable

Voici ce que j'ai essayé:

function slideup(){ 
//exec animation 

} 

Screen.prototype.init = function() { 
    //has access to `this`, Screen is instantiated via constructor and passed the calling element 
    var self = this; 

    self.animation = 'slideup';//this is a switch in my code with default val of 'slideup' 

    function hashChange(){ 

     self.animation.apply(self, [arg1,arg2]); 
    } 
} 

Si je remplace self.animation.apply avec slideup.apply ... la fonction fonctionne correctement, mais quand je lance self.animation.apply ou self[animation].apply je reçois self.animation.apply is not a function. Comment puis-je utiliser la valeur de chaîne stockée dans la variable pour appeler la fonction slideup() et lui transmettre les arguments appropriés? L'idée est que la variable self.animation va stocker le nom d'une fonction d'animation personnalisée, qui peut être surchargée via les options passées du plugin personnalisé.

Répondre

1

Vous obtenez une chaîne. Vous devez accéder à la propriété nommée après cette chaîne: this[this.animation]();

+0

derp? Je sais que j'ai une chaîne, peut-être qu'une phrase complète aiderait-elle à expliquer ce que tu veux dire? J'ai essayé 'self [self.animation] .apply' et 'this [self.animation] .apply' et toujours la même erreur. –

+0

dites-vous que je dois y accéder à partir du niveau auquel la chaîne reviendrait en tant que fonction? –

+0

ne fonctionne pour moi: http://jsfiddle.net/QNYSV/ – Ven

1

Donc Screen.animation est une chaîne qui est le nom d'une fonction. . . Dans ce cas, vous devez utiliser la notation crochet pour accéder à la variable (dans la portée appropriée). En supposant que slideup est une méthode globale, le code que vous recherchez est

window[self.animation].apply(self, [args]); 
+0

J'ai envisagé de faire exactement cela ... Screen.animation est dans la portée du plugin, et bien qu'il puisse accéder à la fenêtre, je préfère qu'il reste dans l'espace de noms. donc je pourrais écrire quelque chose comme 'plugin [self.animation] .apply()' je suppose. C'est une bonne suggestion, je viens de choisir de changer ma fonction en var, et de retourner les noms de fonctions au lieu de chaînes dans l'instruction switch. –

Questions connexes