在你告诉我javascript从上到下读代码之前,让我说我知道。所以我有一个名为startBallEasy()
的函数页面,其下有一个名为stopLoop()
的函数。这基本上就是这样:
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 :(得分: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);
答案 1 :(得分:0)
JavaScript中提升函数和变量声明;您有权访问stopLoop
。它应该按原样运作。所以......
在你告诉我javascript从上到下阅读代码之前,请允许我说我知道。
它不是那样的!
此外,将字符串传递给setTimeout
是一个坏主意;它就像eval
。只需传递一个功能。在这种情况下,您甚至可以同时缩短和清洁它!
loop = setTimeout(startBallEasy, 10);
答案 2 :(得分:0)
您的代码中缺少逻辑。您检查foo
,然后根据值执行某些操作,然后再次开始新的超时,但foo
是什么。
要解决此问题,您需要将超时移至if
:
function startBallEasy() {
if(foo==1) {
alert("foo is 1!");
loop = setTimeout("startBallEasy()",10);
} else {
stopLoop();
}
}
答案 3 :(得分:0)
传递给setTimeout
的字符串或函数将在全局上下文中执行。
如果您在此处发布的代码包含在onLoad
处理程序或类似代码中,则这意味着startBallEasy
是该处理程序的本地代码,因此无法在全局范围内访问。如果您发布的代码完全没有,那么它应该可以正常运行,如所示here(警告:您的代码没有退出条件,所以您将看到的是“foo为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/