我试图将变量名放在传递给函数的变量中,并对其执行操作。
这是我的代码(简化):
function animloop(object, increment, max, direction) {
if (direction == 1) {
object += increment;
if (object >= max) {
clearInterval( pingpong.animloop );
}
}
if (direction == -1) {
object -= increment;
if (object <= max) {
clearInterval( pingpong.animloop );
}
}
}
如果我先设置变量xyz = 10;
,然后调用pingpong.animloop = setInterval( animloop( xyz, 0.1, 40, 1 ) ), 1000 / 60 );
,则无效。
我学到的是,当我调用object += increment;
时,实际上并没有修改object
的值。基本上xyz
的价值没有变化。
希望你明白我在做什么。 :/
答案 0 :(得分:1)
原始数据类型在JS中按值传递,这意味着您没有访问在函数调用之外定义的xyz
。您正在访问一些其他变量,该变量在函数调用时已获得值xyz
的副本。
有几种解决方法。
全球大战:
var xyz = 123;
animLoop(inc,max,dir); // note, no xyz argument
function animLoop(i,m,d) {
xyz++; // global scope xyz is now 124
}
返回值:
xyz = 123;
xyz = animLoop(xyz, max, dir);
function animLoop(obj, max, dir) {
obj++;
return(obj);
}
或使用对象。对象通过引用传递,因此这将起作用:
xyz = { value: 123; }
animLoop(xyz, max, dir);
function animLoop(obj, max, dir) {
obj.value++; // xyz.value is now 124
}
答案 1 :(得分:0)
每当你想要按名称查找局部变量时,你基本上都是“做错了”:)
相反,创建一个对象以容纳相关属性并按名称查找属性。在JavaScript中,每个对象的每个属性都可以通过foo.bar
或foo["bar"]
引用;当属性名称不是合法标识符(例如my form.elements["names[]"]
)或 - 如您的情况 - 当您想要根据变量查找属性时,后者是必需的。
var props = {a:0, b:0};
increment(props,'a');
console.log( props.a ); //1
function increment(obj,propName){
obj[propName]+=1;
}
请注意,在浏览器中,可以访问全局变量,作为全局上下文的window
对象的属性,例如
foo = 42;
var myVar = "foo";
console.log( window[myVar] ); // 42
...但这仍然是一个坏主意,成熟时可能存在命名冲突。使用自定义对象对相关属性进行分组。