7
votes

Appeler de manière dynamique la fonction locale dans JavaScript

Il y a beaucoup de questions similaires à propos d'appeler des fonctions par nom de manière dynamique. Cependant, je ne trouve pas de solution à mon problème spécifique dans lequel j'ai des fonctions locales dans une fermeture sans exposer les fonctions à l'interface publique de mon objet.

permet de voir du code (il s'agit d'un exemple de fiction) ... P>

obj.privateMethod1 = function(arg) {
  //do something with arg
};

obj.privateMethod2 = function(arg) {
  //do something else with arg
};


0 commentaires

5 Réponses :


7
votes

Vous ne pouvez pas faire référence à une variable locale par une chaîne. Vous devez ajouter les objets locaux à un espace de noms:

(function(window,$) {
  // Use "var MyObject = " instead of "MyObject = "!! Otherwise, you're assigning
  //  the object to the closest parent declaration of MyVar, instead of locally!
  var MyObject = (function($) {
    var obj = {};
    var local = {};  // <-- Local namespace
    obj.publicMethod = function(number,otherarg) {
      local['privateMethod'+number].call(this, otherarg);
    };

    var privateMethod1 = local.privateMethod1 = function(arg) {
      //do something with arg
    };

    var privateMethod2 = local.privateMethod2 = function(arg) {
      //do something else with arg
    };

    return obj;
  })($);

  window.MyObject = MyObject;
})(window,jQuery);


1 commentaires

Et de clarifier, vous n'avez plus besoin des déclarations d'alias var privateMethodx car ils font partie de local ; Je suppose qu'ils sont toujours dans cet exemple de comparaison.



8
votes

Les fonctions privées sont des variables locales et ne font pas partie d'un objet. Donc, la notation [...] pour accéder à une propriété ne fonctionnera jamais car il n'y a pas d'objet Les fonctions privées sont des propriétés de.

à la place, vous pouvez faire deux objets: privé et public : xxx


1 commentaires

Si simple droit ... je chantais le mantra au point où j'ai oublié ce que cela voulait dire.



0
votes

Le fait que vous ne puissiez pas appeler ces fonctions de l'extérieur de la portée dans laquelle ils sont définis sont une partie fondamentale de JavaScript, et bien toutes les langues de programmation.

Le seul moyen d'appeler ces fonctions est de les rendre publics . Une approche basée sur la convention peut être appliquée à la place. Le préfixe de soulignement est assez omniprésent et compris généralement signifie "non destiné à être appelé comme une fonction publique", par exemple: xxx


0 commentaires

2
votes

Je suis surpris que la réponse incorrecte soit marquée comme acceptée. En fait, vous pouvez faire référence à une variable locale par une chaîne. Tout simplement en utilisant eval : xxx

Ce code est très mauvais et dans 99,9% de cas, vous ne devez pas utiliser eval . Mais vous devez savoir comment cela fonctionne et ce que vous pouvez faire avec cela. J'ai moi-même eu quelques cas très spécifiques lorsque l'utilisation de eval était nécessaire.


2 commentaires

Ce Q est vieux mais, qu'est-ce qui ne va pas avec la réponse acceptée? Il est largement accepté comme une approche correcte des méthodes publiques / privées sur les objets JavaScript.


En fait, ma plainte était contre "Vous ne pouvez pas faire référence à une variable locale d'une chaîne". Ce n'est pas vrai, tu peux. Comme je l'ai écrit: en utilisant eval est une très mauvaise pratique, mais vous devez savoir comment l'utiliser. Avec eval Vous pouvez accéder à la variable locale par une chaîne. Je pense que cette réponse peut tromper un autre utilisateur javascript. Qu'en est-il d'une autre partie de la réponse - c'est correct (bien que je pense que la variante @PIMVDB était un peu meilleure, mais cela ne pas me tromper).



0
votes

En supposant que vous n'ayez que quelques fonctions à appeler, vous pouvez créer votre propre version de la fenêtre à utiliser pour appeler les fonctions: xxx

puis dans votre code: < Pré> xxx

Assurez-vous simplement que les fonctions sont définies lorsque vous les ajoutez à l'objet. Dans un module où les fonctions n'existent pas au moment de la charge, vous pouvez les ajouter lorsque le module est initialisé: xxx


0 commentaires