2015-05-04 176 views
1

导航到新的html页面后,浏览器中的JavaScript执行何时停止?请问Javascript执行何时停止?

window.location = "index.html"; 

仍然会执行?包含这一行的函数是否返回?当有一个XMLHttpRequest正在运行时,onreadystatechange回调会在带有回调代码的页面被保留之后仍然被调用吗?或者setTimeout调用的回调?这是很好的定义?

+1

你为什么不自己尝试一下,看.. – Zee

+0

@ Sourabh-因为他不是要求执行*行为,而是理论*行为/定义。 – Siguza

+0

我需要一些我可以依赖的东西(不同的浏览器或版本),我正在检查文档,但没有找到答案。 – Gerhard

回答

2

当您导航到新页面时,现有页面将完全关闭。 Javascript上下文被停止并被丢弃。在几行代码完成变量之后,这种关闭是否立即发生。在启动新页面加载时,它可能与某些异步时间有关。

多年来,在设置新位置后,一些浏览器如何处理接下来的几行代码有一些细微的差别,但是您不应该在设置新位置后指望任何行执行,因为设置新位置正在告诉浏览器关闭此页面并开始加载一个新页面。

Chrome中的快速测试显示下一行中的alert()会在完成加载下一个位置之前执行并等待用户输入,但这是未记录的行为并且不安全。

在Firefox中,警报短暂地在屏幕上闪烁,但不等待用户输入并加载新页面。


聪明的办法代码是不放置任何代码设置window.location后。这样,您不会依赖于浏览器之间的行为,所有浏览器的行为都与您的代码相同。如果您想执行其他操作,请在更改window.location之前执行此操作。或者,如果你希望你当前的代码块执行完毕,然后更改一个setTimeout()的位置,如:

setTimeout(function() { 
    window.location = "http://www.stackoverflow.com"; 
}, 1); 

这则可靠地让执行完成的当前线程的页面被改成了新的前位置,因为setTimeout()通过事件队列工作,直到当前的执行线程完成后(无论完成需要多长时间),事件才会被处理。

+1

我不会依靠超时,如果下面有很长的代码。我认为,下面的代码可能会被超时函数中断。 – Gerhard

+1

@Gerhard - 浏览器中的Javascript是单线程的(除了没有参与讨论的webWorkers)。计时器永远不会中断正在运行的Javascript执行线程。当计时器触发时,事件将被添加到Javascript事件队列中,并且只有在当前执行线程完成并且下一个事件从队列中弹出时才会处理该事件。请参阅[本文](http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649)以获取有关该主题的更多参考资料。 – jfriend00

+0

@Gerhard - 所以当处理事件队列上的下一个事件时,会在当前执行线程完成后始终发生setTimeout()。这是如何设计和构建Javascript事件管理和排序的基本方面。很多代码取决于这种行为。 – jfriend00