对于下面的onload 2函数,它们被安排调用' onload'在这两张图片中,有什么能保证在另一张图片开始之前完全完成?在这个单线程环境中需要触发的回调幕后是否有队列?
如果entryFunction从不停止循环,它是否会暂停其线程并屈服于其中一个doWorks()?
我听说javascript不是多线程的,所以entryFunction()是否会产生/暂停这些异步函数调用?
function entryFunction() {
var obj = new Image();
var obj2 = new Image();
// ...
obj.onload = function() { dowork(); }
obj2.onload = function() { dowork(); }
while (1) {
console.log("Actual work is being done");
}
}
function dowork() {
doThis();
doThat();
}
答案 0 :(得分:2)
您的代码不会离开while
循环。因为JavaScript只有一个线程,所以每个函数都必须return
将控制权返还给环境。
在您的示例中,您的示例将使您的浏览器在单独的线程中设置和下载图像(因为浏览器是多线程的)。下载图像后,环境会将对onload()
的呼叫排队。这些将在您的JavaScript程序下次将控制权返回到环境时运行。
但是由于你在while
循环中无限期地控制,控制永远不会返回到环境,并且排队的事件永远不会运行。
答案 1 :(得分:1)
没有任何保证。
你只能保证他们不会在同一时间跑。
while循环将阻止其他js运行。
浏览器本身不限于单个线程实现。 Javascript本身在单个运行循环中运行,但这并不能保证浏览器中的其余部分(并且它们没有)。
答案 2 :(得分:0)
我上面的两个正确答案(原始JS是单线程的,并将阻止它)。也就是说,有一个名为Web Workers的新HTML5 API将为您提供JS中的并发性。
http://www.html5rocks.com/en/tutorials/workers/basics/
它们是“真实的”(就开发人员而言)并发性。有些浏览器确实将它们实现为真正的并发性,有些浏览器会在幕后协同程序和调度程序中捏造它们。
答案 3 :(得分:0)
Javascript不是多线程的,但它是事件驱动的。
dowork()
将被调用,除非onload()
被某种东西调用。
除此之外,(1)不会导致代码继续前进。
而不是while(1)
使用setInterval
或setTimeout。这样,函数不会阻止其余的代码。
如果在new Image()
onload()
导致new Image()
被调用,则可能出现竞争条件