2010-04-08 9 views
3

Comment écrire ce code JavaScript sans eval?Comment écrire ce code JavaScript sans eval?

var typeOfString = eval("typeof " + that.modules[modName].varName); 
if (typeOfString !== "undefined") { 
    doSomething(); 
} 

Le point est que le nom de la var que je veux vérifier est dans une chaîne.

Peut-être que c'est simple mais je ne sais pas comment.

Editer: Merci pour les réponses très intéressantes jusqu'à présent. Je vais suivre vos suggestions et intégrer cela dans mon code et faire des tests et des rapports. Cela pourrait prendre un moment.

Édition2: J'ai eu un autre regard sur le pourrait et c'est peut-être mieux que je vous montre une plus grande image. Je suis reconnaissant pour les experts pour expliquer si beau, il vaut mieux avec plus de code:

MYNAMESPACE.Loader = (function() { 

    function C() { 
    this.modules = {}; 
    this.required = {}; 
    this.waitCount = 0; 
    this.appendUrl = ''; 
    this.docHead = document.getElementsByTagName('head')[0]; 
    } 

    function insert() { 
    var that = this; 
    //insert all script tags to the head now! 
    //loop over all modules: 
    for (var modName in this.required) { 
     if(this.required.hasOwnProperty(modName)){ 
     if (this.required[modName] === 'required') { 
      this.required[modName] = 'loading'; 
      this.waitCount = this.waitCount + 1; 
      this.insertModule(modName); 
     } 
     } 
    } 

    //now poll until everything is loaded or 
    //until timout 

    this.intervalId = 0; 

    var checkFunction = function() { 
     if (that.waitCount === 0) { 
     clearInterval(that.intervalId); 
     that.onSuccess(); 
     return; 
     } 
     for (var modName in that.required) { 
     if(that.required.hasOwnProperty(modName)){ 
      if (that.required[modName] === 'loading') { 
      var typeOfString = eval("typeof " + that.modules[modName].varName); 
      if (typeOfString !== "undefined") { 
       //module is loaded! 
       that.required[modName] = 'ok'; 
       that.waitCount = that.waitCount - 1; 
       if (that.waitCount === 0) { 
       clearInterval(that.intervalId); 
       that.onSuccess(); 
       return; 
       } 
      } 
      } 
     } 
     } 
    }; 

    //execute the function twice a second to check if all is loaded: 
    this.intervalId = setInterval(checkFunction, 500); 
    //further execution will be in checkFunction, 
    //so nothing left to do here 
    } 
    C.prototype.insert = insert; 

    //there are more functions here... 

    return C; 
}()); 


var myLoader = new MYNAMESPACE.Loader(); 

//some more lines here... 

myLoader.insert(); 

Edit3:

Je prévois de mettre cela dans l'espace de noms global dans MYNAMESPACE.loadCheck variable, la simplicité, de sorte que le résultat serait, en combinant des différentes réponses et commentaires:

if (MYNAMESPACE.loadCheck.modules[modName].varName in window) { 
    doSomething(); 
} 

Bien sûr, je vais devoir mettre à jour la classe Loader où jamais « nomVar » est mentionné.

+0

Est-ce une variable locale? –

+0

Quel est le problème avec simplement faire typeof that.modules [nom_module] .varName? Pouvez-vous poster votre code entier. –

+0

@Alexandre: c'est le code d'une fonction d'une classe loader. Donc "ça" fait référence à une instance de la classe. Le code est dans une fonction de la classe. – user89021

Répondre

3

dans JS chaque variable est une propriété, si vous avez aucune idée dont la propriété est, il est une propriété window, donc je suppose que, dans votre cas, cela pourrait fonctionner:

var typeOFString = typeof window[that.modules[modName].varName] 
if (typeOFString !== "undefined") { 
    doSomething(); 
} 
+0

sinon (c'est-à-dire, si vous utilisez le javascript 'avec (objet) {...} 'ou vous êtes dans une * fonction scope *) vous êtes censé rechercher tous les objets qui pourraient le contenir, en séquence. – ZJR

+1

fyi vous pouvez utiliser "this" plutôt que "window" –

+0

Les variables de fonction javascript, IIRC, sont des propriétés de fonction, donc si vous faites: 'function x() {var a = 10;}' vous devrez vérifier 'varName = 'a'; typeof x [varName]; ' – ZJR

1

Puisque vous êtes seulement test de l'existence de l'article, vous pouvez utiliser in plutôt que typeof.

Donc, pour les variables globales que par la réponse de ZJR, vous pouvez les chercher sur l'objet window:

if (that.modules[modName].varName in window) { 
    ... 
} 

Si vous avez besoin de chercher des variables locales, il n'y a aucun moyen de le faire sans eval. Mais ce serait un signe d'une mauvaise conception sérieuse plus haut dans la ligne.

+0

Ce n'est pas exactement le même test. Si la variable était déclarée mais que sa valeur était _undefined_, alors typeof retournerait "undefined", mais dans la fenêtre retournerait true. – Alsciende

+0

@Alsciende Je peux voir la différence. Dans le cas de cette classe, cela n'aurait pas d'importance. – user89021