Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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_While Loop_Infinite Loop - Fatal编程技术网

Javascript 而浏览器和操作系统上编译的程序之间的真正区别

Javascript 而浏览器和操作系统上编译的程序之间的真正区别,javascript,while-loop,infinite-loop,Javascript,While Loop,Infinite Loop,今天我看了我节目的一位同事在他的树莓皮上用Python做的一个小游戏。游戏引擎使用while(true)或无限循环运行。我自己在PHP中使用一个websocket程序,它使用while(true)。在这些示例中,使用了一个无限while循环,它不会导致程序失去响应。没有它,它就不能正常工作。然而,在JavaScript中,我们需要不惜一切代价避免无限循环。当循环变为无限时,浏览器将挂起并变得无响应 我的问题:编译后的Python程序中运行的无限循环与浏览器中运行的JavaScript编写的无限循

今天我看了我节目的一位同事在他的树莓皮上用Python做的一个小游戏。游戏引擎使用
while(true)
或无限循环运行。我自己在PHP中使用一个websocket程序,它使用
while(true)
。在这些示例中,使用了一个无限while循环,它不会导致程序失去响应。没有它,它就不能正常工作。然而,在JavaScript中,我们需要不惜一切代价避免无限循环。当循环变为无限时,浏览器将挂起并变得无响应


我的问题:编译后的Python程序中运行的无限循环与浏览器中运行的JavaScript编写的无限循环有什么区别?

区别在于JavaScript在浏览器的UI线程上运行(防止它输出正常的操作系统消息,如paint),而Python程序没有UI,因此,主线程是否被代码占用并不重要


无论哪种方式,您仍在阻塞主线程,但在不同的上下文中。

在Python中,您的循环可能如下所示:

while true:
    TakeInput()
    DoStuff()
while (true) {
    x = input('Give me input!');
    // Process x
    alert(result);
}
所以循环的每次迭代都会做一些事情,而且它会一直这样做

在JavaScript中,输入通常来自浏览器。如果您的JavaScript代码一直在循环,浏览器就永远不会有机会让您的代码知道新的输入已经到达

您可以编写如下JavaScript代码:

while true:
    TakeInput()
    DoStuff()
while (true) {
    x = input('Give me input!');
    // Process x
    alert(result);
}

这将近似于Python代码,但JavaScript通常不是这样工作的,它将浏览器放在一起。

JavaScript具有异步运行时,这意味着您的代码通常不必等待其他部分继续。您可以使用
setInterval(fn,time)
运行无限无阻塞循环,该循环以
time
毫秒的间隔执行函数
fn

Python和JavaScript代码之间的主要区别在于Python代码负责更新UI,而JS代码只是循环其游戏逻辑,因此阻止浏览器更新其视图

当你做一个游戏时,你通常会把你的名字放在一个循环中,第一次调用会进入游戏逻辑,更新位置、玩家健康状况、猫数等等。然后,调用render方法,以便将更新的内容作为图片处理并发送到屏幕。然后你再开始。在JavaScript中,省略了对呈现函数的调用,因此浏览器的UI永远不会更新

这与线程无关,但在Pyhton(和其他许多语言)这样的语言中,您可以将游戏逻辑和渲染分离开来,这样当您的逻辑需要一段时间时,cat重新定位程序仍然能够更新您的屏幕(重复使用相同的、未更新的内容,但这是另一个主题)

TL;DRJavaScript会阻止浏览器的呈现过程,而Python循环会显式地调用其UI的呈现函数

如@RúnarBerg所述,对于JS,您应该使用
setInterval(函数、时间)


EDIT:@mouser注意到,您也可以使用,这似乎是JS中多线程的html5方法。如果你正在用JS开发一款游戏,可能值得一看,特别是根据w3schools的说法,所有主流浏览器都支持它。

no。两者都会阻止当前线程。@如果python循环可能会更新UI,那么JS代码不会调用浏览器渲染命令。@Sebb您的意思是执行重绘吗?因为如果在python中您没有对UI的控制权,它应该是相同的result@Hacketo在某种程度上当你制作一个游戏时,你通常会把它放在一个循环中,第一次调用会进入游戏逻辑,以更新位置、玩家健康状况、猫数等等。然后,调用render方法,以便将更新的内容作为图片处理并发送到屏幕。然后你再开始。在JavaScript中,您省略了对呈现函数的调用,因此浏览器的UI永远不会更新。Python允许您编写多线程代码,不是吗?JavaScript没有(除了通过web workers)。这是一个解决方案,但我认为他正在寻找解释。@Sebb确实如此。我知道如何通过设置一个非常短的计时器来模拟浏览器中的无限循环。我想更深入地了解浏览器和非浏览器程序中无限循环的区别。非常清楚的解释。我看到“网络工作者”这个词从我身边掠过。这可能是一种解决方法吗?@Mouser这似乎是一个具有良好浏览器支持的好解决方案。我从未真正调查过,但我会更新答案:)