2012-01-18 170 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 

...但是這仍然是通常一個糟糕的主意,用熟了命名衝突的可能性。使用自定義對象來分組相關屬性。