J'ai une difficulté à appeler une fonction à l'intérieur d'une autre fonction lorsque son nom se trouve dans une variable:
var obj = {} obj.f = function() { var inner = { a: function() { function b() { alert('got it!'); } b(); // WORKS AS EXPECTED x = 'b'; [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc. } } inner.a(); } obj.f();
J'ai essayé de préfixer [x]()
avec différents chemins de portée, mais jusqu'à présent sans succès. La recherche de réponses existantes n'a rien trouvé. Cela fonctionne avec this[x]()
si b()
est placé directement dans l'intérieur de l'objet. Je voudrais garder b()
tant que fonction dans la function a()
raison de la portée variable dans la function a()
, sinon je devrais passer de nombreux paramètres à b()
.
//// Re doublons la question: Quentin a fourni une réponse plus élégante dans ce thread imo.
Il n'y a pas de moyen raisonnable d'accéder à une variable arbitraire à l'aide d'une chaîne correspondant au nom de la variable. (Pour une très mauvaise façon de le faire, voir eval
).
[x]();
// NE TROUVE PAS
Vous essayez d'appeler un tableau en tant que fonction
NI
this[x]()
La fonction n'est pas une propriété de l'objet inner
.
window[x]()
, etc.
Comme il n'est pas global, ce n'est pas non plus une propriété de l'objet de fenêtre.
Si vous devez appeler une fonction en fonction de la valeur d'une variable de chaîne, organisez vos fonctions dans un objet et accédez à celles-ci.
function b() { alert('got it!'); } var myFunctions = { b: b }; x = 'b'; myFunctions[x]();
Essaye ça. Actuellement, vous assignez une chaîne à la variable x, au lieu d'une variable de fonction.
x = b; x();
Le problème concerne votre mission
Utilisez x = b
au lieu de x = 'b'
pour attribuer l'objet fonction puisque celui-ci attribue la chaîne à x.
Une fois que vous avez réparé votre tâche, vous pouvez invoquer la fonction comme
x(); ax(); a[x]();
etc.
Vous devez créer un tableau pour la fonction, puis accéder à l'utilisation du nom dans votre variable comme suit:
var obj = {} obj.f = function() { var inner = { a: function() { // set up the possible functions: var myFuncs = { b: function b() {alert('got it!');} }; //b(); // WORKS AS EXPECTED --> commented this code x = 'b'; myFuncs[x](); } } inner.a(); }
La déclaration de fonction b
sera capturée lors de la fermeture de l' expression de la fonction anonyme attribuée en tant a
.
var
est utilisé dans une fermeture, il n'y a pas d'objet (disponible en JavaScript ) qui reçoit une propriété semblable à ce qui se passe avec la window
dans Global Scope . Si vous voulez vraiment accéder à une variable (c'est-à-dire b
) par String , vous devrez créer un objet qui détient b
semblable à ce que vous avez fait pour a
ou (et peut-être dangereusement) compter sur un eval
pour convertir "b"
b
.
Si vous ne pouvez pas créer l' objet entier à l'avance, vous pouvez utiliser ce format
/* in (higher?) scope */ var fnRef = {}; // now when you function b() {/* define as desired */} // also keep a ref. fnRef['b'] = b; // fnRef['b']() will work **after this line**
Disons que votre code est comme ceci:
//instead of x = 'b' x = function(){}
Alors votre solution pourrait être comme ceci:
var obj = {} obj.f = function() { var inner = { a: function() { function b() { alert('got it!'); } b(); // WORKS AS EXPECTED //you can define it as a variable var x = function(){}; //and call it like this x(); //or define it like this this[x] = function(){}; //and call it like this this[x](); //but you are creating an array [x] which is not a function //and you are trying to call an array???? [x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc. } } inner.a(); } obj.f();