La fonction d'appel dynamiquement en Javascript
Je veux dynamiquement appeler une fonction d'une chaîne comme "Utilisateur.trouver". Un script d'appel de la fonction find() dans l'objet Utilisateur si la fonction existe. Voici ce que j'ai essayé:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1);
var methodToCall = method[1];
nameObj.call(methodToCall, some_data_array);
Mais elle revient toujours:
nameObj.call(methodToCall, some_data_array);
TypeError: Object User has no method 'call'
Une idée? Je ne peux pas utiliser la fenêtre, car il est un node.js problème, le script n'est pas exécuté dans le navigateur.
nameObj
est un string, pas une fonction?quand il s'agit de dynamique, essayez d'utiliser
eval
.C'est pourquoi je pose la question ici. Je ne sais pas comment appeler une fonction d'un objet dynamique.
Non; ne pas utiliser
eval
.Oui je veux éviter d'utiliser eval.
OriginalL'auteur Codel | 2014-10-12
Vous devez vous connecter pour publier un commentaire.
Vous êtes complètement malentendu
call()
.call()
vous permet d'appeler une méthode avec un autrethis
.Vous souhaitez obtenir aussi bien par son nom:
Ce n'est pas ce que l'OP veut. Au moins l'OP problème n'est pas claire maintenant. Il n'a même pas une droit ici, ainsi que certains de référence de la méthode (juste le nom de la méthode).
est une chaîne de caractères. Pour obtenir la variable globale du même nom, utilisez la même syntaxe:
window[nameObj]
.Je ne peux pas utiliser la fenêtre, car le script n'est pas exécuté dans le navigateur, mais avec node.js. J'ai juste modifié avec un plus explication claire du problème.
C'est parce que JSFiddle encapsule le code dans une fonction, donc, ceux qui sont les habitants.
OriginalL'auteur SLaks
Vous pouvez réellement atteindre cet objectif. Vous premier besoin d'obtenir l'
scope
, où votre espace de noms/fonction/objet est défini.Par exemple, dans votre code, je suppose que son
window
.Donc, un peu de modification de votre code d'obtenir le résultat souhaité:
Marque l'utilisation de
global[]
. C'est là que ça commence.[édité] * code Modifié pour utiliser
global
au lieu dewindow
que d'être utilisé dansnodejs
.C'est pourquoi j'ai écrit - vous avez besoin pour obtenir le
scope
et mon exemple a l'aide dewindow
portée. Vous auriez probablement un champ d'application différent (à savoirglobal
). Je vais changer le code.Ah oui désolé, mais comment pouvez-vous obtenir portée ?
Ok merci pour la réponse. Je vais essayer de le que. Je pense que je vais encore aller avec SLaks réponse, car il est plus facile de manipuler les données, mais il m'a aidé ;).
La portée est généralement là que vous définissez
User
et dans la majorité des cas, il est donné parthis
.OriginalL'auteur sudipto
La façon d'utiliser
fn.call
etfn.apply
estou
Si vous ne pouvez pas faire bouillir votre code vers le bas pour soit simple de ces déclarations, l'appel d'une fonction dynamiquement est pas pour vous.
C'est mieux servi que d'un commentaire ou d'une intro, l'une réponse. Comme il est, il n'est pas réellement répondre à la question.
OriginalL'auteur user633183
Ce que vous voulez faire est d'accéder à l'objet global.
Cela devrait fonctionner:
Il ne fonctionnera pas dans jsfiddle, exécuter dans la console. Edit: je suppose que c'est parce que de la façon dont le violon exécute le JS, et c'est de ne pas déclarer
User
objet dans la portée globale.Voici ce que j'obtiens:
TypeError: Property 'connect' of object #<Object> is not a function
OriginalL'auteur EvilZebra