web-dev-qa-db-fra.com

Convertir une chaîne en un nom de variable en JavaScript

J’ai cherché des solutions, mais n’en ai trouvé aucun qui fonctionne.

J'ai une variable appelée onlyVideo.

"onlyVideo" la chaîne est passée dans une fonction. Je veux définir la variable onlyVideo dans la fonction comme quelque chose. Comment puis je faire ça?

(Un certain nombre de variables peuvent être appelées dans la fonction. J'ai donc besoin qu'elle fonctionne de manière dynamique, et non d'instructions if codées en dur.)

Edit: Il y a probablement une meilleure façon de faire ce que vous essayez de faire. J'ai demandé cela au début de mon aventure JavaScript. Découvrez comment fonctionnent les objets JavaScript.

Une simple introduction:

// create JavaScript object
var obj = { "key1": 1 };

// assign - set "key2" to 2
obj.key2 = 2;

// read values
obj.key1 === 1;
obj.key2 === 2;

// read values with a string, same result as above
// but works with special characters and spaces
// and of course variables
obj["key1"] === 1;
obj["key2"] === 2;

// read with a variable
var key1Str = "key1";
obj[key1Str] === 1;
209
switz

Si c'est une variable globale, alors window[variableName].__ ou dans votre cas window["onlyVideo"] devrait faire l'affaire.

241
ingo

Javascript a une fonction eval() pour de telles occasions:

function (varString) {
  var myVar = eval(varString);
  // .....
}

Edit: Désolé, je pense avoir écrasé la question trop rapidement. Cela ne vous donnera que la variable, pour la définir vous avez besoin

function SetTo5(varString) {
  var newValue = 5;
  eval(varString + " = " + newValue);
}

ou si vous utilisez une chaîne:

function SetToString(varString) {
  var newValue = "string";
  eval(varString + " = " + "'" + newValue + "'");
}

Mais j'imagine qu'il existe un moyen plus approprié d'accomplir ce que vous recherchez? Je ne pense pas que eval () est quelque chose que vous voulez vraiment utiliser sauf s'il existe une bonne raison à cela. eval ()

141
goggin13

En ce qui concerne eval vs. solutions globales variables ...

Je pense qu'il y a des avantages pour chacun mais c'est vraiment une fausse dichotomie ... Si vous êtes paranoïaque de l'espace de noms global, créez simplement un espace de noms temporaire et utilisez la même technique.

var tempNamespace = {};
var myString = "myVarProperty";

tempNamespace[myString] = 5;

Je suis sûr que vous pourrez alors accéder à tempNamespace.myVarProperty (maintenant 5), en évitant d’utiliser window pour le stockage. (La chaîne pourrait également être placée directement dans les crochets)

36
jm0
var myString = "echoHello";

window[myString] = function() {
    alert("Hello!");
}

echoHello();

Dites non à la mauvais eval. Exemple ici: https://jsfiddle.net/Shaz/WmA8t/

13
Shaz

Vous pouvez accéder à l'objet window en tant que tableau associatif et le définir de cette manière.

window["onlyVideo"] = "TEST";
document.write(onlyVideo);
8
Eric Conner

La méthode window ['nomVariable'] fonctionne UNIQUEMENT si la variable est définie dans la portée globale. La bonne réponse est "Refactor". Si vous pouvez fournir un contexte "Object", il existe une solution générale possible, mais il existe des variables qu'aucune fonction globale ne pourrait résoudre en fonction de la portée de la variable.

(function(){
    var findMe = 'no way';
})();
7
Lance Caraccioli

Si vous essayez d'accéder à la propriété d'un objet, vous devez commencer par la portée de window et parcourir chaque propriété de l'objet jusqu'à atteindre celle que vous souhaitez. En supposant que a.b.c ait été défini ailleurs dans le script, vous pouvez utiliser les éléments suivants:

var values = window;
var str = 'a.b.c'.values.split('.');

for(var i=0; i < str.length; i++)
    values = values[str[i]];

Cela fonctionnera pour obtenir la propriété de n'importe quel objet, quelle que soit sa profondeur.

4
user1846065

Tu peux faire comme ça

var name = "foo";
var value = "Hello foos";
eval("var "+name+" = '"+value+"';");
alert(foo);

2
Eliyah Sundström

Le code suivant facilite la référence à chacune de vos DIV et autres éléments HTML en JavaScript. Ce code doit être inclus juste avant la balise, afin que tous les éléments HTML aient été vus. Il devrait être suivi de votre code JavaScript.

// For each element with an id (example: 'MyDIV') in the body, create a variable
// for easy reference. An example is below.
var D=document;
var id={}; // All ID elements
var els=document.body.getElementsByTagName('*');
for (var i = 0; i < els.length; i++)
    {
    thisid = els[i].id;
    if (!thisid)
        continue;
    val=D.getElementById(thisid);
    id[thisid]=val;
    }

// Usage:
id.MyDIV.innerHTML="hello";
0
David Spector

Cela peut être fait comme ça

(function(X, Y) {
  
  // X is the local name of the 'class'
  // Doo is default value if param X is empty
  var X = (typeof X == 'string') ? X: 'Doo';
  var Y = (typeof Y == 'string') ? Y: 'doo';
  
  // this refers to the local X defined above
  this[X] = function(doo) {
    // object variable
    this.doo = doo || 'doo it';
  }
  // prototypal inheritance for methods
  // defined by another
  this[X].prototype[Y] = function() {
    return this.doo || 'doo';
  };
  
  // make X global
  window[X] = this[X];
}('Dooa', 'dooa')); // give the names here

// test
doo = new Dooa('abc');
doo2 = new Dooa('def');
console.log(doo.dooa());
console.log(doo2.dooa());

0
yunzen