Fonction d'appel JavaScript dans une fonction par nom de variable

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 .

  1. Lorsque 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 .
  2. L'écriture d'une déclaration de fonction varie efficacement avec le nom de la fonction .

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();