Javascript setInterval可以工作,但不能无限循环
我不明白为什么无限循环不起作用,但取消对函数调用的注释却起作用Javascript setInterval可以工作,但不能无限循环,javascript,html,dom,setinterval,Javascript,Html,Dom,Setinterval,我不明白为什么无限循环不起作用,但取消对函数调用的注释却起作用 <body> <canvas id="myCanvas"style="border:2px solid black;" width="1600" height="900"> Your browser does not support the HTML5 canvas tag. </canvas> <script> var c = document.getElementB
<body>
<canvas id="myCanvas"style="border:2px solid black;" width="1600" height="900">
Your browser does not support the HTML5 canvas tag.
</canvas>
<script>
var c = document.getElementById ("myCanvas").getContext ("2d");
var boxSize = 25;
var numBoxes = 1;
var x = 1000;
var dx = 1;
var y = 100;
var dy = 1;
var a = 0.01;
var da = 0.1;
var size = 20;
var w = c.canvas.width;
var h = c.canvas.height;
//function testing () {
while (true) {
c.clearRect (0, 0, w, h);
x = x + 1;
y = y + 1;
a = a + 0.1;
x = x + dx;
y = y + dy;
if (x < size / 2 || x + (size / 2) > w) {
dx = -dx;
da = -da;
}
if (y < size / 2 || y + (size / 2) > h) {
dy = -dy;
da = -da;
}
c.save ();
c.translate (x, y);
c.rotate (a);
c.strokeRect (-size / 2, -size / 2, size, size);
c.restore ();
}
// testing ();
// setInterval (testing, 10);
</script>
</body>
您的浏览器不支持HTML5画布标记。
var c=document.getElementById(“myCanvas”).getContext(“2d”);
var-boxSize=25;
var-numBoxes=1;
var x=1000;
var-dx=1;
变量y=100;
var-dy=1;
var a=0.01;
var-da=0.1;
变量大小=20;
var w=c.canvas.width;
var h=c.画布高度;
//功能测试(){
while(true){
c、 clearRect(0,0,w,h);
x=x+1;
y=y+1;
a=a+0.1;
x=x+dx;
y=y+dy;
如果(xw){
dx=-dx;
da=-da;
}
如果(yh){
dy=-dy;
da=-da;
}
c、 保存();
c、 翻译(x,y);
c、 轮换(a);
c、 strokeRect(-size/2,-size/2,size,size);
c、 恢复();
}
//测试();
//设定间隔(测试,10);
当您使用setInterval
时,您会不断将您正在调用的函数添加到浏览器要执行的任务队列中。重新绘制事件也会添加到此队列中
当您使用无限循环时,浏览器永远不会到达函数的末尾,因此它永远不会运行重新绘制,文档中的图像也永远不会更新。当您使用
setInterval
时,您会不断将要调用的函数添加到浏览器要执行的任务队列中。重新绘制事件也会添加到此队列中尤埃
当您使用无限循环时,浏览器永远不会到达函数的末尾,因此它永远不会运行重新绘制,文档中的图像也永远不会更新。JavaScript-in-a-browser是更大结构的一部分。您需要与此结构的规则保持一致,而不要伤害它。其中一个规则是您的JavaScript必须快速运行,然后退出。退出意味着控件返回框架,框架完成所有工作,重新绘制屏幕等 多次尝试隐藏和显示某些内容:
for (n = 0; n < 200; n++) {
$("#test").hide();
$("#test").show();
}
(n=0;n<200;n++)的{
$(“#测试”).hide();
$(“#测试”).show();
}
当此代码运行时,您不会看到任何闪烁,您将看到最后一个命令将生效
不得不说,以这种方式组织代码并不容易,如果你想在画布上画出漂亮的动画,你必须马上完成。浏览器中的JavaScript是一个更大结构的一部分。你需要与这个结构的规则保持一致,而不要伤害它。其中一个规则是你的JavaScript必须快速运行退出意味着控件返回框架,框架完成所有工作,重新绘制屏幕等 多次尝试隐藏和显示某些内容:
for (n = 0; n < 200; n++) {
$("#test").hide();
$("#test").show();
}
(n=0;n<200;n++)的{
$(“#测试”).hide();
$(“#测试”).show();
}
当此代码运行时,您不会看到任何闪烁,您将看到最后一个命令将生效
不得不说,以这种方式组织代码并不容易,如果你想在画布上画出漂亮的动画,你必须不用while来完成。
while(true)
似乎是让浏览器崩溃的好方法?我知道,但为什么它不起作用?只是好奇为什么setInterval,而不是requestAnimationFrame?正如我所尝试的,setInterval和while都能起作用,但问题是while触发速度很快,很快你的浏览器就会崩溃。while(true)
似乎是一种使浏览器崩溃的好方法?我知道,但为什么它不起作用?只是好奇为什么setInterval,而不是requestAnimationFrame?正如我所尝试的,setInterval和while都能起作用,但问题是while触发的速度很快,很快你的浏览器就会崩溃。我不太明白。很抱歉,这太幼稚了,但是整个循环不会重新绘制页面吗ctangle?因为它在循环中运行代码太忙,无法运行重新绘制页面的功能。啊,我知道了。是谁将重新绘制事件添加到浏览器队列中的?浏览器会自动执行此操作。你只需要让它有时间运行它。我不太明白。很抱歉,这太幼稚了,但整个循环不会重新绘制矩形吗e?因为它在循环中运行代码太忙,无法运行重新绘制页面的功能。啊,我知道了。谁将重新绘制事件添加到浏览器队列?浏览器会自动执行此操作。你只需要让它有时间运行它。有意义。谢谢你。有意义。谢谢你。