333

I’ve looked for solutions, but couldn’t find any that work.

I have a variable called onlyVideo.

"onlyVideo" the string gets passed into a function. I want to set the variable onlyVideo inside the function as something. How can I do that?

(There are a number of variables that could be called into the function, so I need it to work dynamically, not hard coded if statements.)

Edit: There’s probably a better way of doing what you’re attempting to do. I asked this early on in my JavaScript adventure. Check out how JavaScript objects work.

A simple intro:

// 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;
3
  • 6
    What are you using this for? Are you absolutely sure you need to set it to a normal local variable, and an Object (Hash) won't work? Commented Apr 10, 2011 at 18:32
  • mmm... I still don't quite grasp why you want to do this in a world with arrays. Anyway, some of your code and explanation would help a lot. Commented Apr 10, 2011 at 18:34
  • i think we need more detail about what your ultimate goal is Commented Apr 10, 2011 at 18:35

12 Answers 12

351

If it's a global variable then window[variableName] or in your case window["onlyVideo"] should do the trick.

Sign up to request clarification or add additional context in comments.

6 Comments

Even if not global, you can access it like that by scope[property] or even this[property]
@WojciechBednarski: Don't confuse scope and context. this is context, what it points to depends on how the function is called. In JS, 50% of the time this is window unless you enable strict mode and this becomes undefined and will throw an error. Scope is something completely different and it's not an object (except global scope which is mirrored by the window object)
Doesn't work in WebWorkers (where self reffers to global scope, just as it does in browser, where it's equal to window) and Node.js, where global is the variable you want. And it newer works with local scopes, such as the function body.
is there anyway to define a const using this method?
What if the variable was create using let and const? It won't be a part of global scope.
|
223

Javascript has an eval() function for such occasions:

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

Edit: Sorry, I think I skimmed the question too quickly. This will only get you the variable, to set it you need

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

or if using a string:

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

But I imagine there is a more appropriate way to accomplish what you're looking for? I don't think eval() is something you really want to use unless there's a great reason for it. eval()

7 Comments

Yeah I would go with this rather then using window ( it has some caveats)
@goggin You should regex-test the argument to make sure that it's a valid name. Just evaling the argument without checking it first is ridiculously insecure.
This is the only realistic answer to the question. Just because it involved the "eeeeevil" eval does not make it any less true. Javascript does not have variable variables (such as $$varname in php) so this really is the only answer. Using window[varname] has the side-effect of introducing global variables, which might not be wanted. @Shaz I don't think you give modern JS interpreters enough credit. They are extremely fast, and parsing and executing a simple one line assignment operation is not going to spike anyone's CPU usage as long as it is not being done in a 1ms timer or tight loop.
Summary: eval is evil Details: the window['variableName'] method ONLY works if the variable is defined in the global scope. I've seen a ton of these. The correct answer is "Refactor".
I'm so confused about this. I'm accustomed to working in autohotkey where I can make variables out strings very easily. Can you show me another example of how to use this to create a variable from a joined string and then assign it a value?
|
55

As far as eval vs. global variable solutions...

I think there are advantages to each but this is really a false dichotomy. If you are paranoid of the global namespace just create a temporary namespace & use the same technique.

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

tempNamespace[myString] = 5;

Pretty sure you could then access as tempNamespace.myVarProperty (now 5), avoiding using window for storage. (The string could also be put directly into the brackets)

3 Comments

A bit refactor your code to make the same inline var tempNamespace = {["myVarProperty"]: "Definitely only video"};
This is a very good solution - it seems like eval() is to be avoided unless absolutely necessary, very elegant workaround here.
Starting with the collection document.body.getElementsByTagName('*') it is easy to find all the elements having an 'id' attribute and create a variable for the element object value of each one in a global object 'id'. Then you can refer to <div id=container> in JavaScript as 'id.container'. So easy!
22
var myString = "echoHello";

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

echoHello();

Say no to the evil eval. Example here: https://jsfiddle.net/Shaz/WmA8t/

3 Comments

Make this work on local scope and I will remove the downvote.
@TomášZato function aScope() { this[myString] = function() { alert("Hello!"); };};
@richmondwang this is not refference to the local scope but to the object that the function is bound to during call.
10

You can do like this

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

Comments

9

You can access the window object as an associative array and set it that way

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

Comments

7

The window['variableName'] method ONLY works if the variable is defined in the global scope. The correct answer is "Refactor". If you can provide an "Object" context then a possible general solution exists, but there are some variables which no global function could resolve based on the scope of the variable.

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

Comments

7

If you're trying to access the property of an object, you have to start with the scope of window and go through each property of the object until you get to the one you want. Assuming that a.b.c has been defined somewhere else in the script, you can use the following:

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

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

This will work for getting the property of any object, no matter how deep it is.

4 Comments

Your example is cool. I note that if I use name as the variable name, your example fails, but it works with other variable names. This may have to do with the Window object already having a name variable. Also, including the .value method caused failure. The ability to interpret deeply nested object variables is what I am looking for and your method indicates a good direction. Thanks.
No problem. The answer is more to demonstrate the concept rather than be a copy/paste answer (as are most answers here on SO I think)
SO responses are even better when you can spend the time improving them rather than fixing them. ;-)
Doesn't work: Uncaught TypeError: Cannot read property 'split' of undefined
0

It can be done like this

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

Comments

0

The following code makes it easy to refer to each of your DIVs and other HTML elements in JavaScript. This code should be included just before the tag, so that all of the HTML elements have been seen. It should be followed by your JavaScript code.

// 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";

Comments

0

Here, Short and Sweet If You Want to convert your answer into variable

 const container = "foo"

// if you want foo as varible

   eval(container)  

according 2023 Javascript

3 Comments

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
There are way better existing answers on how to use eval for this.
This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review
-1

let me make it more clear

function changeStringToVariable(variable, value){
window[variable]=value
}
changeStringToVariable("name", "john doe");
console.log(name);
//this outputs: john doe
let file="newFile";
changeStringToVariable(file, "text file");
console.log(newFile);
//this outputs: text file

1 Comment

Welcome to Stack Overflow! While this code may solve the question, including an explanation of how and why this solves the problem would really help to improve the quality of your post, and probably result in more up-votes. Remember that you are answering the question for readers in the future, not just the person asking now. Please edit your answer to add explanations and give an indication of what limitations and assumptions apply.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.