311 votes

Convertir une chaîne en nom de variable en JavaScript

J'ai cherché des solutions, mais je n'en ai trouvé aucune 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 à l'intérieur de la fonction comme quelque chose. Comment puis-je le faire ?

(Il y a un certain nombre de variables qui pourraient être appelées dans la fonction, donc j'ai besoin qu'elle fonctionne de manière dynamique, et non pas codée en dur). if déclarations.)

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

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;

5 votes

A quoi cela sert-il ? Êtes-vous absolument sûr que vous avez besoin de la définir comme une variable locale normale, et qu'un objet (Hash) ne fonctionnera pas ?

0 votes

Mmm... Je ne comprends toujours pas pourquoi vous voulez faire ça dans un monde avec des tableaux. Quoi qu'il en soit, un peu de votre code et des explications m'aideraient beaucoup.

0 votes

Je pense que nous avons besoin de plus de détails sur ce qu'est votre objectif final.

329voto

ingo Points 2212

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

47 votes

Même s'il n'est pas global, vous pouvez y accéder comme ça en scope[property] ou même this[property]

11 votes

@WojciechBednarski : Ne confondez pas la portée et le contexte. this est un contexte, ce vers quoi il pointe dépend de la façon dont la fonction est appelée. En JS, 50% du temps this es window sauf si vous activez le mode strict et this devient undefined et lancera une erreur. La portée est quelque chose de complètement différent et ce n'est pas un objet (à l'exception de la portée globale qui est reflétée par la balise window objet)

3 votes

Ne fonctionne pas dans WebWorkers (où self renvoie à la portée globale, tout comme dans le navigateur, où il est égal à window ) et Node.js, où global est la variable que vous voulez. Et il fonctionne plus récemment avec les portées locales, comme le corps de la fonction.

212voto

goggin13 Points 2324

Javascript a un eval() pour de telles occasions :

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

Edit : Désolé, je pense avoir parcouru la question trop rapidement. Cela ne vous donnera que la variable, pour la définir, il faut

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

ou si vous utilisez une chaîne de caractères :

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() soit quelque chose que vous voulez vraiment utiliser à moins qu'il y ait une grande raison pour cela. eval()

3 votes

Oui, j'opterais pour cette solution plutôt que d'utiliser la fenêtre (il y a quelques inconvénients).

12 votes

Pourquoi un eval() réponse déclassée pour être supprimée, et celle-là reprise ?

1 votes

@BoltClock : bonne question. De plus, je pense que je me suis précipité et que j'ai mal lu la question, je ne suis pas sûr que ma réponse aide vraiment le PO. J'ai ajouté une modification qui, je pense, fait ce que @Switz veut, mais je suis également d'accord avec les commentaires sur la question, il y a probablement une façon beaucoup plus appropriée d'accomplir ceci.

50voto

jm0 Points 519

En ce qui concerne les solutions eval vs. variable globale...

Je pense qu'il y a des avantages à chacun d'eux, mais c'est vraiment une fausse dichotomie. Si vous êtes paranoïaque à l'égard 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 pourriez alors accéder à tempNamespace.myVarProperty (maintenant 5), en évitant d'utiliser window pour le stockage. (La chaîne de caractères pourrait également être placée directement entre les parenthèses).

0 votes

Un peu de remaniement de votre code pour rendre la même chose en ligne var tempNamespace = {["myVarProperty"] : "Définitivement seulement vidéo"} ;

1 votes

C'est une très bonne solution - il semble que eval() soit à éviter sauf si c'est absolument nécessaire, une solution très élégante ici.

0 votes

En partant de la collection document.body.getElementsByTagName('*'), il est facile de trouver tous les éléments ayant un attribut 'id' et de créer une variable pour la valeur de l'objet élément de chacun d'eux dans un objet global 'id'. Vous pouvez ensuite faire référence à <div id=container> en JavaScript en tant que 'id.container'. C'est si simple !

22voto

Shaz Points 7458
var myString = "echoHello";

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

echoHello();

Dites non à la maléfique eval. Exemple ici : https://jsfiddle.net/Shaz/WmA8t/

3 votes

Faites en sorte que cela fonctionne à l'échelle locale et j'enlèverai le downvote.

0 votes

@TomášZato function aScope() { this[myString] = function() { alert("Hello!"); };};

0 votes

@richmondwang this n'est pas une référence à la portée locale mais à l'objet auquel la fonction est liée lors de l'appel.

9voto

Eric Conner Points 1984

Vous pouvez accéder à l'objet fenêtre comme un tableau associatif et le définir de cette manière

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X