JavaScript:查找变量';s值的名称,这里可以接受eval吗?

JavaScript:查找变量';s值的名称,这里可以接受eval吗?,javascript,reflection,eval,Javascript,Reflection,Eval,警告:正如其他人在此所述,此问题是基于不灵活的客户需求。虽然这个问题是有效的,但如果可能的话,您一定应该使用更简单的解决方案(例如:将设置放在单个对象中) 我有一系列我想“留意”的变量。也就是说:如果它们以前在代码中定义过,我需要能够对它们的值进行操作 var a='foo';//只定义了一个 //…这里有更多代码。。。重要提示:我只能控制这条线以下的内容! var target='example.com/?'; var gets=['a','b','c'];//这些是我要检查的变量的名称 g

警告:正如其他人在此所述,此问题是基于不灵活的客户需求。虽然这个问题是有效的,但如果可能的话,您一定应该使用更简单的解决方案(例如:将设置放在单个对象中)

我有一系列我想“留意”的变量。也就是说:如果它们以前在代码中定义过,我需要能够对它们的值进行操作

var a='foo';//只定义了一个
//…这里有更多代码。。。重要提示:我只能控制这条线以下的内容!
var target='example.com/?';
var gets=['a','b','c'];//这些是我要检查的变量的名称
gets.forEach(函数(元素){//检查每一个
if(typeof元素!=='undefined'){//如果它是以前定义的
target+=“&”+element+“=”+eval(element);//将`&a=foo`添加到target
}
});

警报(目标)这类问题的答案几乎总是“你把问题想错了”,这里就是这样

您假设这应该通过变量来完成,这样您就只能使用
eval()
来摆脱这个困境。我知道客户可能要求使用常规变量,但如果我是一名房屋建造者,而客户要求我用棉花糖建造房屋,我会说“不”,这不是解决问题的方法

解决方案是从一开始就使用具有键和值的对象,这允许您以后使用数组索引语法,而不是
eval

//将需要签入的项目保留在对象中
var obj={
a:'foo'//只定义了a
}
var target='example.com/?';
var gets=['a','b','c'];
//检查每个数组元素
gets.forEach(函数(元素){
//对象可以使用数组索引语法,其中字符串作为索引传递
//因为对象实际上有键,而不是数字索引
if(obj[element]){//if是先前定义的
target+=“&”+element+“=”+obj[element];//将`&a=foo`添加到target
}
});

警报(目标)假设您无法执行其他操作,并且所有操作都在全局范围内,则无需使用
eval()
。(我非常确定
eval
一定有一些有效的用例,但我不认为这是其中之一。)

因为您不应该信任这些变量的内容,所以不应该使用
eval
。如果您的客户选择受到影响怎么办?(或者你的客户根本不知道他们在做什么。)

var css_color='tweet(document.cookie)';
您可以简单地利用这样一个事实,即可以从全局范围访问变量:

const serialize_options=(…vars)=>
瓦尔斯
.filter(v=>typeof this[v]!=='undefined')
.map(v=>`${v}=${this[v]}`)
.加入(“&”);
log(序列化_选项('a'));
log(序列化_选项('a','b');
log(序列化_选项('a','b','c');
log(序列化_选项('a','x','y')

变量a='10';
var b='20';
var c='30';

我有一个要侦听的变量数组,在我的示例中,可能有一些变量的名称为
a
b
c
,这些变量以前在代码中声明过。如果设置了它们(不是未定义的),那么我希望对它们的值进行操作。在本例中,由于设置了
a
,我想将其值(
foo
附加到我的
target
字符串中)。因此,您真的只是说,如果数组中的任何具有名称的变量发生更改,您想做些什么?不,如果已定义,我想从变量中获取值。因此,在前面的代码中,如果
vara='Something'
是编写的,然后
a
以前已经定义过,现在我想得到它的值:
某物
客户要求能够这样做。他们正在使用我编写的JS文件在他们的页面上嵌入一些内容,他们希望能够通过在注入JS文件之前定义变量来控制某些参数。因此,虽然可能有100种其他方法来解决这个问题,但这是客户想要的,因此我提出了这个问题。不要假装这是最佳实践,但这是技术问题的问答场所,而不是客户管理问题,对吗-我很好奇:这种[v]类型的
有什么好处!='未定义“
而不是
此[v]!==未定义的
?除此之外,我没有看到
var a、var b、var c
方法如何比让客户通过脚本或JSON字符串中的对象注入更好,尽管,是的,这确实很好地回答了这个问题。@ggorlen绝对没有;只是习惯的力量。@ggorlen我和你们大家在一起;不应该这样做。但我过去也曾在类似的环境中工作过,在这种环境中,需求是一成不变的,或者您正在处理无人敢碰的遗留系统。作为JS变量的“选项列表”是我以前见过的。无论如何,问题是
eval
是否是解决这个问题的好办法。我相信我已经回答了这个问题,解释了为什么没有,并提供了一个替代方案。我同意所有这些,谢谢。理想情况下,OP会提前声明,这是一种传统/一成不变的情况,消除了所有“不要这样做”的反应。问题是,在许多情况下,人们会无意中发现这些线程,并且在没有上下文的情况下认为这是正确的方法。@ggorlen Good call,我在顶部放了一个大的警告标题,以确认这是一个不好的要求。