Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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中的vs setTimeout_Javascript_Function_While Loop_Stack Overflow_Settimeout - Fatal编程技术网

而Javascript中的vs setTimeout

而Javascript中的vs setTimeout,javascript,function,while-loop,stack-overflow,settimeout,Javascript,Function,While Loop,Stack Overflow,Settimeout,我试图弄清楚,在Javascript中编写while循环(将运行很长一段时间)还是setTimeout函数更好。据我所知,由于JavaScript是单线程的,任何一个函数长时间运行都是不好的,因为这意味着没有其他函数能够同时运行。因此,在我看来,设置超时会更好 (1) 有人能确认上述情况属实吗 (2) 如果重复使用setTimeout,是否会出现堆栈溢出问题,如下面的示例所示 function enqueueSomething() { doSomething(); setTime

我试图弄清楚,在Javascript中编写while循环(将运行很长一段时间)还是setTimeout函数更好。据我所知,由于JavaScript是单线程的,任何一个函数长时间运行都是不好的,因为这意味着没有其他函数能够同时运行。因此,在我看来,设置超时会更好

(1) 有人能确认上述情况属实吗

(2) 如果重复使用setTimeout,是否会出现堆栈溢出问题,如下面的示例所示

function enqueueSomething() {
    doSomething();
    setTimeout(enqueueSomething);
vs

引文:从这里改编的代码:(meagar的评论)

while(true)将创建一个无限循环,如果您不以某种方式在Javascript中退出它。这就是为什么异步编程在javascript中非常流行的原因

无论如何,您是正确的,setTimeout或setInterval都是理想的。如果计划渲染某些内容,则渲染循环应使用requestAnimationFrame

或者,有些webworker类似于线程,但是在使用它们时会丢失很多作用域(例如,window在webworker的作用域中变得未定义)。如果您需要卸载处理,并且可以将整个过程包含在一个简单的范围内(例如执行繁重的计算),那么Webworkers非常有用。

而如果您没有在Javascript中以某种方式退出,那么(true)将创建一个无限循环。这就是为什么异步编程在javascript中非常流行的原因

无论如何,您是正确的,setTimeout或setInterval都是理想的。如果计划渲染某些内容,则渲染循环应使用requestAnimationFrame


或者,有些webworker类似于线程,但是在使用它们时会丢失很多作用域(例如,window在webworker的作用域中变得未定义)。如果您需要卸载处理,并且可以将整个过程包含在一个简单的范围内(例如执行繁重的计算),那么Webworkers非常棒。

您可以正确地认为javascript是单线程的,当一个函数运行时,其他函数无法运行。在浏览器中,这也意味着整个页面将冻结(使用不能键入、移动鼠标等)


setTimeout
是一个更好的选择

javascript是单线程的,当一个函数运行时,其他函数不能运行,这是正确的。在浏览器中,这也意味着整个页面将冻结(使用不能键入、移动鼠标等)


setTimeout
是一个更好的选择

阻止代码执行时,您的代码将被困在那里,直到循环完成。可能会使浏览器过载,导致应用程序的选项卡崩溃

setTimeout
将创建任务来执行代码,并继续执行代码的其余部分。当在
setTimeout
执行函数时,它将停止执行
setTimeout
函数的操作


循环阻塞其余代码直到完成时,
设置超时
设置间隔
不要。

当阻塞代码执行时,代码将被困在那里直到循环完成。可能会使浏览器过载,导致应用程序的选项卡崩溃

setTimeout
将创建任务来执行代码,并继续执行代码的其余部分。当在
setTimeout
执行函数时,它将停止执行
setTimeout
函数的操作

While
循环将阻塞其余代码直到完成,
setTimeout
setInterval
不要。

While循环
虽然
循环会更适合您的代码,但正如许多人所说,它们可能会有问题并永远持续下去。最好的办法是限制循环可以重复的次数:

var i = 0;
while (my_condition && i < 10000000) {
    i++;
}

动画/渲染 如果要渲染/动画,则需要使用使用“递归”函数的


多线程任务 Web工作者也是一个选项,因为他们可以在单独的线程上运行。你可以了解他们


时机 使用
setTimeout
使用异步方法
setInterval
可能更合适,它被设计为递归

如果您打算毫不延迟地使用
setTimeout/Interval
方法,您可能应该远离它


速度/结论 请注意,现在计算机速度非常快,几乎可以立即递归100000次。关于递归/速度的所有问题。我总是说,用
而用
和递归函数递归是最好的,如果你有>100000个,你会有更大的问题,比如内存,如果你从服务器上得到它,服务器负载

我会坚持使用递归函数、web workers或RequestAnimationFrame,具体取决于您所做的工作。只有当您要使用带有延迟的
setTimeout/Interval
时,才应该使用它(在我看来)

While循环
虽然
循环会更适合您的代码,但正如许多人所说,它们可能会有问题并永远持续下去。最好的办法是限制循环可以重复的次数:

var i = 0;
while (my_condition && i < 10000000) {
    i++;
}

动画/渲染 如果要渲染/动画,则需要使用使用“递归”函数的


多线程任务 Web工作者也是一个选项,因为他们可以在单独的线程上运行。你可以了解他们


时机 使用
setTimeout
使用异步方法
setInterval
可能更合适,它被设计为递归

如果您打算毫不延迟地使用
setTimeout/Interval
方法,您可能应该远离它


速度/结论 请注意
function recurse() {
    super_specific_condition && recurse();
}