2012-01-18 22 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では数値が不変です。 –

+0

それでは、すでに設定した変数をいつも修正できましたか? –

+0

@ ryansworld10番号自体は変更していません。変数、オブジェクトプロパティ、または配列インデックスが_new_番号を参照しています。変数はオブジェクトや値を「保持」せず、それらを参照します。 – Phrogz

答えて

1

プリミティブデータ型はJSで値渡しされるため、関数呼び出しの外で定義したxyzにはアクセスしません。関数呼び出し時に値xyzのコピーを与えられた他の変数にアクセスしています。

周りにはいくつかの方法があります。

グローバルVARS:

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

最後のコードスニペットを間違っていないように修正するまで下降します。 _(ヒント: 'xyz = {value:42};')_ – Phrogz

+0

これは完璧です、私はオブジェクトの回避策を使用し、それは魅力のように動作します! –

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 

...しかし、これはまだ通常は悪い考え、命名の衝突の可能性と熟しています。カスタムオブジェクトを使用して、関連するプロパティをグループ化します。

関連する問題