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

IT技术 javascript variables
2021-01-21 16:49:43

我一直在寻找解决方案,但找不到任何有效的解决方案。

我有一个名为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;
6个回答

如果它是一个全局变量,那么window[variableName] 或者在您的情况下window["onlyVideo"]应该可以解决问题。

无论如何定义一个const使用这种方法?
2021-03-10 16:49:43
@WojciechBednarski:不要混淆范围和上下文。this是上下文,它指向什么取决于函数的调用方式。在JS中,50%的时间thiswindow,除非您启用严格模式,并this成为undefined和将抛出一个错误。范围是完全不同的东西,它不是一个对象(除了由window对象镜像的全局范围
2021-03-12 16:49:43
如果变量是使用 let 和 const 创建的怎么办?它不会成为全局范围的一部分。
2021-03-31 16:49:43
即使不是全局的,您也可以像这样访问它,scope[property]甚至this[property]
2021-04-01 16:49:43
不适用于WebWorkers(这里self指的是全局范围,就像它在浏览器中一样,它等于window)和 Node.js,global你想要的变量在哪里它较新的适用于局部作用域,例如函数体。
2021-04-02 16:49:43

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() 是你真正想要使用的东西,除非有很好的理由。评估()

这是对这个问题唯一现实的答案。仅仅因为它涉及“eeeeevil”评估并不会使它变得不那么真实。Javascript 没有可变变量(例如 php 中的 $$varname),所以这确实是唯一的答案。使用window[varname]具有引入全局变量的副作用,这可能不是我们想要的。@Shaz 我认为您没有给予现代 JS 解释器足够的信任。它们非常快,解析和执行一个简单的单行分配操作不会增加任何人的 CPU 使用率,只要它不是在 1ms 计时器或紧密循环中完成的。
2021-03-18 16:49:43
@goggin 您应该对参数进行正则表达式测试以确保它是有效名称。不先检查就评估论点是非常不安全的。
2021-03-28 16:49:43
为什么一个eval()答案反对删除,而这个答案赞成?
2021-04-01 16:49:43
是的,我会选择这个而不是使用窗口(它有一些警告)
2021-04-02 16:49:43
@TheParamagneticCroissant 对代码管理充满热情的人。那些只看重时间和金钱的人不看重。
2021-04-05 16:49:43

至于 eval 与全局变量的解决方案......

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

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

tempNamespace[myString] = 5;

很确定您可以作为 tempNamespace.myVarProperty(现在是 5)访问,避免使用 window 进行存储。(字符串也可以直接放在括号中)

从集合 document.body.getElementsByTagName('*') 开始,很容易找到所有具有 'id' 属性的元素,并为全局对象 'id' 中每个元素的元素对象值创建一个变量。然后你可以在 JavaScript 中将 <div id=container> 称为“id.container”。太简单!
2021-03-10 16:49:43
稍微重构您的代码以制作相同的内联 var tempNamespace = {["myVarProperty"]: "Definitely only video"};
2021-03-21 16:49:43
这是一个非常好的解决方案 - 除非绝对必要,否则似乎应该避免使用 eval() ,这里非常优雅的解决方法。
2021-04-01 16:49:43
var myString = "echoHello";

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

echoHello();

邪恶的评估说不这里的例子:https : //jsfiddle.net/Shaz/WmA8t/

在本地范围内进行这项工作,我将删除downvote。
2021-03-10 16:49:43
@TomášZato function aScope() { this[myString] = function() { alert("Hello!"); };};
2021-03-29 16:49:43
@richmondwangthis不是对局部作用域的引用,而是对函数在调用期间绑定到的对象的引用。
2021-04-04 16:49:43

您可以将窗口对象作为关联数组访问并以这种方式设置

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