Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的设置间隔停止工作?_Javascript - Fatal编程技术网

Javascript 为什么我的设置间隔停止工作?

Javascript 为什么我的设置间隔停止工作?,javascript,Javascript,当我添加“for”时,为什么“setInterval”停止工作 <script> var x=0; setInterval(function() {counter()},1); function counter() { x++; } for(var start=0; start <= 100; start++) { alert("x is "+x+" and start is "+start); } </scrip

当我添加“for”时,为什么“setInterval”停止工作

<script>
    var x=0;
    setInterval(function() {counter()},1);
function counter()
{
     x++;
}
for(var start=0; start <= 100; start++)
    {
        alert("x is "+x+" and start is "+start);
    }
</script>

var x=0;
setInterval(函数(){counter()},1);
函数计数器()
{
x++;
}
对于(var start=0;start,因为Javascript不是(在本例中)多线程的,所以您的setInterval基本上意味着“下次主线程不做任何事情并且超时已经过去时,让它执行我的回调”

for循环会阻止主线程,直到它完成为止(并且在显示101个警报之前它不会退出,每个警报都在等待用户输入),因此在for循环结束并且主线程可以返回“不做任何事情”之前,回调不会发生。

,因为Javascript没有(在本例中)多线程,您的setInterval基本上意味着“下次主线程不做任何事情并且超时已经过去,让它执行我的回调”


for循环会阻止主线程,直到它完成为止(并且在显示101个警报之前它不会退出,每个警报都在等待用户输入),因此在for循环结束并且主线程可以返回“不做任何事情”之前,回调不会发生.

不妨注意,问题不完全在于
,而在于
警报
,这通常是一个同步动作,会停止脚本执行。@Fabriciomatté是的,谢谢,我对原因的描述有点欠缺,在回答中添加了一条关于这一点的注释。+1,尽管DOM 0
警报
>没有规范,浏览器可能会有不同的解释。例如,OP的时间间隔将在Firefox 15-18上的警报之间间歇性执行,而在Chrome上它们将完全同步。@SamK。这将取决于您试图做什么。尝试测量循环的时间?@SamK。然后我建议您只做
varstime=new Date()
在循环和警报的开始处(或者更好地登录到控制台)
new Date()-stime
在合适的位置显示自
stime
以来的毫秒数,这将不需要任何超时运行。不妨注意,问题不完全是
,而是
警报
,这通常是一个同步操作,会停止脚本执行。@Fabriciomatté是的,谢谢,我是我对原因的描述有点欠缺,在回答中添加了一条关于这一点的评论。+1,尽管DOM 0
alert
没有规范,浏览器可能会对其进行不同的解释。例如,OP的间隔将在Firefox 15-18上的警报之间间歇性执行,而在Chrome上则完全同步。@SamK。这将取决于您尝试执行的操作。尝试测量循环的计时?@SamK。然后我建议您在循环开始时执行
var stime=new Date()
,并发出警报(或者更好地登录到控制台)
new Date()-stime
在合适的位置显示自
stime
以来的毫秒数,这将不需要任何超时来运行。