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

swi*_*itz 245 javascript variables

我找了解决方案,但找不到任何有效的方法.

我有一个名为的变量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;
Run Code Online (Sandbox Code Playgroud)

ing*_*ngo 265

如果它是一个全局变量那么window[variableName] 或者在你的情况下window["onlyVideo"]应该做的伎俩.

  • 即使不是全局的,你也可以通过`scope [property]`甚至`this [property]`来访问它 (31认同)
  • @WojciechBednarski:不要混淆范围和背景.`this`是上下文,它指向的内容取决于函数的调用方式.在JS中,50%的时间`this`是`window`,除非你启用严格模式并且`this`变为`undefined`并且会抛出错误.范围是完全不同的东西,它不是一个对象(除了由`window`对象镜像的全局范围) (7认同)
  • 不适用于`WebWorkers`(其中`self`引用全局范围,就像它在浏览器中那样,它等于`window`)和Node.js,其中`global`是你想要的变量.它更新适用于本地范围,例如函数体. (3认同)
  • 如果变量是使用 let 和 const 创建的怎么办?它不会成为全球范围的一部分。 (2认同)

gog*_*n13 155

Javascript具有以下eval()功能:

function (varString) {
  var myVar = eval(varString);
  // .....
}
Run Code Online (Sandbox Code Playgroud)

编辑:对不起,我想我太快地浏览了这个问题.这只会给你变量,设置你需要的变量

function SetTo5(varString) {
  var newValue = 5;
  eval(varString + " = " + newValue);
}
Run Code Online (Sandbox Code Playgroud)

或者如果使用字符串:

function SetToString(varString) {
  var newValue = "string";
  eval(varString + " = " + "'" + newValue + "'");
}
Run Code Online (Sandbox Code Playgroud)

但我想有一种更合适的方法来完成你想要的东西?我不认为eval()是你真正想要使用的东西,除非它有很好的理由.的eval()

  • 这是这个问题的唯一现实答案.仅仅因为它涉及"eeeeevil"eval并没有使它变得不那么真实.Javascript没有变量变量(例如php中的$$ varname),所以这确实是唯一的答案.使用`window [varname]`有引入全局变量的副作用,这可能是不想要的.@Shaz我不认为你给现代JS口译员足够的信誉.它们非常快*,只要没有在1ms定时器或紧密循环中完成,解析和执行简单的一行分配操作就不会激活任何人的CPU使用率. (16认同)
  • 为什么一个'eval()`的答案被推翻到删除,这一个被投票? (12认同)
  • @goggin你应该对参数进行正则表达式测试,以确保它是一个有效的名称.只是在没有先检查它的情况下评估参数是非常不安全的. (4认同)
  • 是的,我会用这个而不是然后使用窗口(它有一些警告) (3认同)
  • @TheParamagneticCroissant热衷于代码护理的人.那些只重视时间和金钱的人不会. (2认同)

jm0*_*jm0 40

就eval与全局变量解决方案而言......

我认为每个都有优势,但这确实是一个错误的二分法.如果你是全局命名空间的偏执,只需创建一个临时命名空间并使用相同的技术.

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

tempNamespace[myString] = 5;
Run Code Online (Sandbox Code Playgroud)

很确定你可以访问tempNamespace.myVarProperty(现在为5),避免使用窗口进行存储.(字符串也可以直接放入括号中)


Sha*_*haz 15

var myString = "echoHello";

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

echoHello();
Run Code Online (Sandbox Code Playgroud)

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

  • 使这项工作在本地范围内,我将删除downvote. (3认同)

Eri*_*ner 8

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

window["onlyVideo"] = "TEST";
document.write(onlyVideo);
Run Code Online (Sandbox Code Playgroud)


Lan*_*oli 8

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

(function(){
    var findMe = 'no way';
})();
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您尝试访问对象的属性,则必须从对象的作用域开始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]];
Run Code Online (Sandbox Code Playgroud)

这将适用于获取任何对象的属性,无论它有多深。


小智 5

你可以这样做

var name = "foo";
var value = "Hello foos";
eval("var "+name+" = '"+value+"';");
alert(foo);
Run Code Online (Sandbox Code Playgroud)