2012-03-02 4 views
1

У меня проблемы, когда я вызываю функцию, которая вызывает другую функцию, которая продолжает обратный вызов, до тех пор, пока головоломка не будет решена или не будет найден никаких ходов.Проблемы с одновременным вызовом двух функций

Дело в том, что мне нужно вызвать функцию дважды, но с разными значениями.

Я попытался сохранить значения, но как только я вызову вторую функцию, которая перезвонит, она переопределяет значения.

наиболее важные фрагменты кода здесь:

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(); 
} 

Notes, splitways() изменяет значения dir и xy, поэтому я попытался изменить их обратно, а затем необходимости модифицировать их перед вторым вызовом splitways() , Но при первом звонке все стирается.

Я пробовал все, что мог, за 2 часа ... Лучший снимок, который у меня был, - это кешировать их на var aa=num,bb=pos;, но это не сработало.

Любые идеи оценили

+0

не беспокойтесь о globals 'dir, xy, start, arr и т. Д. И т. Д.' Они предназначены – mithril333221

+0

@ Joseph no, я взял на это меры. Если вас интересует полный код, см. Http://jsfiddle.net/WgBpJ/ – mithril333221

+0

проблема заключается в том, что сами глобалы. глобальные переменные здесь настолько изменчивы, доступны везде, где вы не можете отслеживать, кто что изменил. – Joseph

ответ

1

Хотя я не совсем уверен, что вы пытаетесь сделать с вашим кодом, я думаю, что у вас есть некоторые из вашей логики смешалось:

На первом вызове (I предположим, что вы сначала вызываете splitways()), вы устанавливаете «aa = dir» (давайте обратим внимание только на это). Когда «caller()», он принимает глобальную переменную «dir», очевидно. Теперь в «caller()» вы устанавливаете «aa = num», который переводится в «aa = dir». Вы снова вызываете плетения, что затем делает то же самое: «aa = dir». Это продолжается постоянно (AKA: пока вызов вызывающего абонента() не будет вызван). Однако, поскольку он возвращается через стек выполнения, у вас есть в «caller()», «dir = aa». Теперь вы уже сделали «aa = num», поэтому «dir = aa» абсолютно ничего не делает, так как вы еще не изменили значение «dir» в любом месте, которое выполнено.

В конце концов, самый последний вызов «вызывающего абонента»() вызовет строку «dir == 1? Dir = 4: dir--», но когда эта функция завершится и выполнение вернется к SECOND TO LAST «вызывающему» (), он сбрасывает «dir = aa», поэтому dir никогда не изменяется до ОЧЕНЬ последнего вызова (первое выполнение «caller()», которое произошло).

Если это не имеет никакого смысла, хорошо. Там должен быть лучший способ сделать то, что вы пытаетесь сделать. Может быть, я могу помочь с этим?

+0

Я на самом деле смысл :), много часов пытался сделать невозможное ... – mithril333221

Смежные вопросы