设置传递给函数的变量?

时间:2012-01-18 18:47:27

标签: javascript html5-canvas

我试图将变量名放在传递给函数的变量中,并对其执行操作。

这是我的代码(简化):

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的价值没有变化。

希望你明白我在做什么。 :/

2 个答案:

答案 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.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

...但这仍然是一个坏主意,成熟时可能存在命名冲突。使用自定义对象对相关属性进行分组。