2013-05-27 2 views
0

Прежде чем вы скажете мне, что javascript читает код сверху донизу, позвольте мне просто сказать, что я это знаю. Поэтому у меня есть страница с функцией, называемой startBallEasy(), а другая под ней называется stopLoop(). Это в основном то, что это:clearTimeout не работает, потому что функция не определена

var foo = 1; 
var loop; 

function startBallEasy() { 
    if(foo==1) { 
     alert("foo is 1!"); 
    } else { 
     stopLoop(); 
    } 

    loop = setTimeout("startBallEasy()",10); 
} 

function stopLoop() { 
    clearTimeout(loop); 
} 

так startBallEasy() в значительной степени себя петли. Если это определенное условие, оно остановится. Но он не может найти функцию, потому что она еще не объявлена. Как мне это сделать?

+0

неважно, я решил это – user2423654

+2

Пожалуйста, можете ли вы опубликовать ответ самостоятельно, а не просто сказать «Я решил это». – lifetimes

+0

У вас есть обработчик onLoad вокруг этого кода? –

ответ

0

Попробуйте это,

var loop=null; 
function startBallEasy() { 
    if(foo==1) { 
     alert("foo is 1!"); 
    } else { 
     clearTimeout(loop); 
    } 

    loop = setTimeout("startBallEasy()",10); 
} 
setTimeout("startBallEasy()",10); 

Вы можете использовать setInterval (если вы не хотите использовать функцию рекурсии) вместо setTimeout как,

var foo = 1; 
var loop=null; 
function startBallEasy() { 
    if(foo==1) { 
     alert("foo is 1!"); 
    } else { 
     clearInterval(loop); 
    } 
} 
loop = setInterval("startBallEasy()",10); 
0

Функции и объявления переменных поднимаются в JavaScript; у вас есть доступ к stopLoop. Он должен работать как есть. Итак ...

Прежде чем вы скажете мне, что javascript читает код сверху донизу, позвольте мне сказать, что я это знаю.

Это не так!

Кроме того, передача строк до setTimeout - плохая идея; это как eval. Просто передайте функцию. В этом случае вы даже можете сделать его короче и чище в одно и то же время!

loop = setTimeout(startBallEasy, 10); 
+1

Это глупо, как единственный правильный ответ имеет самый низкий результат. –

0

В вашем коде немного недостатка в логике. Вы проверяете foo, а затем делаете что-то в зависимости от значения, а затем снова начинаете новый таймаут, тем не менее, что foo.

Чтобы это исправить, необходимо переместить тайм-аут в if:

function startBallEasy() { 
    if(foo==1) { 
     alert("foo is 1!"); 
     loop = setTimeout("startBallEasy()",10); 
    } else { 
     stopLoop(); 
    }  
} 
+0

Я не могу, потому что я забыл упомянуть, в моей реальной программе, у меня есть больше методов после 'if ... else' – user2423654

0

Строка или функции вы передаете setTimeout будет выполняться в глобальном контексте.

Если код, который вы отправили здесь, завернут в обработчик onLoad или аналогичный, это будет означать, что startBallEasy является локальным для этого обработчика и поэтому недоступен в глобальной области. Если код, который вы опубликовали, есть все, то он должен работать нормально, как показано here (предупреждение: ваш код не имеет условия выхода, поэтому вы увидите бесконечный поток предупреждений «foo is 1!»).

Решение, как упомянуто в minitech, заключается в передаче функции, которая закрывает свою зависимость (startBallEasy) до setTimeout.

var foo = 1; 
var loop; 

function startBallEasy() { 
    if(foo==1) { 
     alert("foo is 1!"); 
    } else { 
     stopLoop(); 
    } 

    loop = setTimeout(function(){startBallEasy();},10); 
} 

function stopLoop() { 
    clearTimeout(loop); 
} 

Обратите внимание, что в настоящее время на вашем коде нет условий выхода. Вот немного измененная демонстрация, которая отсчитывает от 0 до 9, регистрируя состояние foo на каждой итерации: http://jsfiddle.net/JWyzy/

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