我正在尝试在 javascript 中动态引用变量
我尝试调用的变量是 amtgc1#(其中 # 的范围为 1-7)
我正在使用 while 语句进行循环,并且 while 语句中计数变量的值与我尝试调用的变量的最后一位数字相对应。
例如:
var inc=3;
var step=0;
while(step < inc){
var dataString = dataString + amtgc1#;
var step = step+1;
}
其中#基于变量“step”的值。我该怎么做呢?任何帮助表示赞赏!谢谢!!
不要将
amtgc1[1-7]
定义为 7 个不同的变量,而是将它们实例化为数组。所以你的服务器代码会发出:
var amtgc1 = [<what used to be amtgc11>,<what used to be amtgc12>, ...insert the rest here...];
然后,您可以使用数组语法在循环中引用它们:
var dataString = dataString + amtgc1[step];
执行此操作的唯一方法(据我所知)是将所有 amtgc1# 变量放入一个对象中,例如:
myVars = {
amtgc1: 1234,
amtgc2: 12345,
amtgc3: 123456,
amtgc4: 1234567
};
然后你可以像这样引用它
myVars["amtgc" + step];
怎么样:
var dataString = dataString + eval('amtgc1' + step);
确实,并不总是推荐使用
eval()
,但那是可行的。否则,根据范围,您可以引用大多数内容,例如 JavaScript 中的对象。也就是说,以下是您可以执行的操作的示例。
全球范围
var MyGlobalVar = 'secret message';
var dynamicVarName = 'MyGlobalVar';
console.log(window.[dynamicVarName]);
功能范围
function x() {
this.df = 'secret';
console.log(this['df']);
}
x();
未经测试,但不明白为什么你不能这样做......
$('#amtgc1' + step).whatever();
如果您的
amtgc1*
变量被定义为对象的属性,您可以通过名称引用它们。假设它们在全局范围内声明,它们将是 window
对象的成员。
var inc=7;
var step=0;
while(step < inc){
var dataString = dataString + window['amtgc1'+(step+1)];
var step = step+1;
}
如果它们定义在不同的范围内(在函数内)但不属于任何其他对象,那么您就会陷入
eval
,这通常被认为是不好的。
另外,万岁
for
循环!
var inc=7;
for ( var step=0; step < inc; step++ ){
var dataString = dataString + window['amtgc1'+(step+1)];
}
我已经构建了一种方法,您可以使用对象来存储键值来解决这个问题,其中键是对任务的引用,值是操作(函数),您可以在循环内使用 if 来检查当前任务并触发操作。
如果您想将动态连接的字符串与“变量”进行比较,您应该使用 eval() 函数。
/* store all tasks references in a key value, where key will be
* the task reference and value will be action that the task will
* Execute
*/
var storeAllTasksRefer = {
amtgc11:function(){ alert("executing task amtgc11"); },
amtgc112:function(){ alert("executing task amtgc112"); },
"amtgc1123":"amtgc1123"
// add more tasks here...
};
var inc = 7;
var step = 1;
var dataString = 'amtgc1';
while(step <= inc){
var dataString = dataString + step;
//alert(dataString); // check its name;
step = step+1;
// check if it is my var
if( dataString == 'amtgc112' ){
// here I will reference my task
storeAllTasksRefer.amtgc112();
}// end if
/* you can also compare dynamically using the eval() function */
if('amtgc1123' == eval('storeAllTasksRefer.'+dataString)){
alert("This is my task: "+ eval('storeAllTasksRefer.'+dataString));
} // end this if
} // end while
此外,如果您使用 Web 组件并使用 JS 类,那么您可以通过变量(字段)的名称动态检索变量(字段),因为“this”是一个对象:
testVar = 'test';
let varName = 'testVar';
console.log(this[varName]);