在JavaScript中将字符串转换为变量名


260

我一直在寻找解决方案,但找不到任何可行的方法。

我有一个名为的变量onlyVideo

"onlyVideo"字符串被传递给函数。我想onlyVideo将函数内部的变量设置为某种值。我怎样才能做到这一点?

(可以在函数中调用许多变量,因此我需要它动态地工作,而不是硬编码的if语句。)

编辑:可能有更好的方法来做您要尝试的事情。我在JavaScript冒险的早期就问过这一点。查看JavaScript对象的工作方式。

一个简单的介绍:

// 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
你用这个做什么 您是否完全确定需要将其设置为普通的局部变量,并且对象(哈希)将不起作用?
Dogbert

嗯...我仍然不太了解为什么要在数组世界中做到这一点。无论如何,您的一些代码和解释将大有帮助。
凯文·查韦斯

我认为我们需要更多有关您的最终目标的细节
mcgrailm 2011年

Answers:


280

如果它是一个全局变量,然后window[variableName] 或在你的情况window["onlyVideo"]应该做的伎俩。


35
即使不是全球性的,你可以通过这样的访问scope[property],甚至this[property]
沃伊切赫Bednarski

7
@WojciechBednarski:不要混淆范围和上下文。this是上下文,它指向的内容取决于函数的调用方式。在JS中,除非您启用严格模式,否则50%的时间this会变成并且将引发错误。范围是完全不同的东西,它不是对象(对象所镜像的全局范围除外)windowthisundefinedwindow
slebetman 2015年

3
不适用于WebWorkersself与全局范围相同,就像在浏览器中一样,等于window)和Node.js,即global您想要的变量。而且它较新,可与局部作用域一起使用,例如函数体。
托马什Zato -恢复莫妮卡

反正有定义const使用此方法?
toing_toing

165

JavaScript在eval()以下情况下具有以下功能:

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

编辑:对不起,我想我讲得太快了。这只会为您获取变量,您需要对其进行设置

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

或者使用字符串:

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

但是我想有一种更合适的方法来完成您想要的?除非有充分的理由,否则我不认为eval()是您真正想要使用的东西。eval()


3
是的,我会选择使用此方法,而不是使用window(它有一些警告)
ingo 2011年

12
为什么一个eval()答案被拒绝删除,而这个答案被拒绝呢?
BoltClock

4
@goggin您应该对参数进行正则表达式测试,以确保其为有效名称。仅仅逃避论点而不先检查它是非常不安全的。
森那维达斯

16
这是对该问题的唯一现实答案。仅仅因为它涉及“ eeeeevil”评估,就不会使它不那么真实。Javascript没有变量(例如php中的$$ varname),因此这确实是唯一的答案。使用window[varname]具有引入全局变量的副作用,而这可能是不希望的。@Shaz我认为您没有给现代JS解释器足够的信誉。它们非常快,并且只要不以1ms计时器或紧密循环的方式进行解析和执行简单的单行分配操作,就不会增加任何人的CPU使用率。
MooGoo 2011年

2
@TheParamagneticCroissant对代码护理充满热情的人。那些只珍惜时间和金钱的人不会。
Jimbo,2015年

41

至于评估与全局变量解决方案...

我认为每种方法都有优点,但这确实是错误的二分法。如果您对全局名称空间有偏执,只需创建一个临时名称空间并使用相同的技术即可。

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

tempNamespace[myString] = 5;

可以肯定的是,您随后可以以tempNamespace.myVarProperty的身份访问(现在为5),避免使用存储窗口。(字符串也可以直接放在括号中)


稍微重构您的代码,以制作相同的内联var tempNamespace = {[“ myVarProperty”]:“绝对只有视频”};
蒂玛'17

1
这是一个非常好的解决方案-除非绝对必要,否则应该避免使用eval(),这是一种非常优雅的解决方法。
skwidbreth

从集合document.body.getElementsByTagName('*')开始,很容易找到所有具有'id'属性的元素,并为全局对象'id'中每个元素的对象值创建一个变量。然后,您可以在JavaScript中将<div id = container>称为“ id.container”。太简单!
David Spector

15
var myString = "echoHello";

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

echoHello();

邪恶的评价说不。此处的示例:https : //jsfiddle.net/Shaz/WmA8t/


3
使此工作在本地范围内进行,我将删除downvote。
托马什Zato -恢复莫妮卡

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

@richmondwang this不是引用本地作用域,而是引用函数在调用过程中绑定到的对象。
托马什Zato -恢复莫妮卡

8

您可以将窗口对象作为关联数组进行访问并进行设置

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

8

仅当在全局范围内定义变量时,window ['variableName']方法才有效。正确的答案是“重构”。如果可以提供“对象”上下文,则可能存在通用解决方案,但是有些变量无法根据变量的范围解析全局函数。

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

6

如果要访问对象的属性,则必须从对象的范围开始,window并遍历对象的每个属性,直到获得所需的属性为止。假设a.b.c已在脚本的其他位置定义了以下内容,则可以使用以下内容:

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

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

无论对象的深度如何,这都将用于获取其属性。


你的例子很酷。我注意到,如果将我name用作变量名,则您的示例将失败,但是它可以与其他变量名一起使用。这可能与Window对象已经具有name变量有关。另外,包括导致.value方法失败的方法。我正在寻找能够解释深层嵌套的对象变量的能力,并且您的方法指明了一个好的方向。谢谢。
西奥

没问题。答案更多是为了演示概念,而不是复制/粘贴答案(就像我认为的大多数答案一样)

1
当您可以花时间改进它们而不是解决它们时,SO响应会更好。;-)
Theo

不起作用:Uncaught TypeError: Cannot read property 'split' of undefined
Roberto18年


0

可以这样做

(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

下面的代码使引用JavaScript中的每个DIV和其他HTML元素变得容易。该代码应位于标记之前,以便可以看到所有HTML元素。它后面应该是您的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";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.