2012-01-18 169 views
0

我试图把一个变量名传递给函数的变量中,并在其上执行操作。设置传递给函数的变量?

这里是我的代码(简化):

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

数字是在JavaScript中不可变的。 – 2012-01-18 18:53:38

+0

那么我怎样才能一直修改我已经设置的变量? – 2012-01-18 18:57:23

+0

@ ryansworld10你还没有修改号码本身。您已经导致变量,对象属性或数组索引引用_new_数字。变量不“持有”对象或值,他们引用它们。 – Phrogz 2012-01-18 19:07:38

回答

1

基本数据类型由值在JS传递,这意味着你没有访问你的函数调用的外部限定的xyz。您正在访问一些OTHER变量,该变量在函数调用时已被赋予值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 
} 
+0

Downvoted,直到你修复你的最后一个代码片段而不是错误的。 _(提示:'xyz = {value:42};')_ – Phrogz 2012-01-18 19:09:23

+0

这是完美的,我使用了对象解决方法,它的功能就像一个魅力! – 2012-01-18 19:10:24

0

每当你想要查找的名字一个局部变量,你基本上是“做错了” :)

相反,创建一个对象收藏相关物业并按名称查找物业。在JavaScript中,每一个对象的每个属性可以或者通过foo.barfoo["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 

...但是这仍然是通常一个糟糕的主意,用熟了命名冲突的可能性。使用自定义对象来分组相关属性。