2012-03-02 10 views
1

パズルが解かれるまで、または何も動かないときにコールバックを続ける他の関数を呼び出す関数を呼び出すときに問題があります。同時に2つの関数を呼び出すときの問題

私は関数を2回呼び出す必要がありますが、異なる値を使用する必要があります。

私は値を格納しようとしましたが、すぐにwchichが呼び出す2番目の関数を呼び出すと、値が上書きされます。コードの

最も重要な部分はここにある:

function splitways(){ 
    var strsp,aa=dir,bb=xy; 
    if(nextRock()){ 
     if(xy!=start){ 
      strsp=(aa+""+bb+""+dir+""+xy)*1; 
      if(!(strsp in arr)){ 
       arr[strsp]=strsp; 
       caller(dir,xy); 
      } 
     }else{ 
      count++; 
     } 
    } 
} 

function caller(num,pos){ 
    var aa=num,bb=pos; 
    splitways(); 
    //-- 
    dir=aa; 
    xy=bb; 
    //-- 
    dir==1?dir=4:dir--; 
    splitways(); 
} 

ノート、splitways()は私がsplitways()に2回目の呼び出し前に・修正バックし、それらを変更しようとした理由があり、dirxyの値を変更します。しかし、最初の呼び出しですべてが消去されます。

私は2時間できるすべてを試しました...私が持っていたベストショットはvar aa=num,bb=pos;にキャッシュしていましたが、うまくいかなかったのです。

すべてのアイデアは、私はあなたのコードでやろうとしているか全くわからないが、私はあなたが混ざっあなたのロジックのいくつかを持っていると思う

+0

グローバル変数 'dir、xy、start、arrなどについては心配しないでください。'彼らが意図しています – mithril333221

+0

@Josephいいえ、私はそれを私はとらえました。完全なコードに興味がある場合は、http://jsfiddle.net/WgBpJ/ – mithril333221

+0

を参照してください。問題はグローバル自体です。グローバルは非常に揮発性があり、どこでも編集可能で、誰が何を変更したのか追跡することはできません。 – Joseph

答えて

1

を高く評価されています

最初の呼び出しでは(私はsplitways()を最初に呼び出すと仮定した場合、 "aa = dir"を設定します(これにのみ注意してください)。 "caller()"を実行すると、明らかにグローバル変数 "dir"が使用されます。今、 "caller()"では、 "aa = num"を "aa = dir"に変換します。 splitwaysをもう一度呼び出すと、まったく同じことが実行されます。 "aa = dir"です。これは絶えず継続しています(呼び出し元()が呼び出されなくなるまで)。しかし、実行スタックを経由すると、 "caller()"に "dir = aa"があります。さて、あなたはすでに "aa = num"を実行していますので、 "dir = aa"はまだ実行されている場所で "dir"の値を変更していないので絶対に何もしません。

最終的に "caller()"コールは "dir == 1?dir = 4:dir--"行を実行しますが、その関数が終了して実行が2番目の "呼び出し元) "を呼び出すと、" dir = aa "がリセットされるので、最後のVERY呼び出し(起きた最初の"呼び出し元() "実行までdirは実際には変更されません)。

これは絶対に意味がない場合、良い。あなたがしようとしていることをあなたが行うためのより良い方法が必要になります。多分私はそれを助けることができますか?

+0

私は実際に意味があります:)、不可能なことを何時間も試みました... – mithril333221

関連する問題