我一直在阅读John Resig的“
JavaScript忍者的秘密”,它解释了JavaScript是单线程的.但是,我试过测试这个,我不知道该从这里带走什么:
// executing this in browser
(function () {
// throw something into event queue
setTimeout(function () {
alert("This will be called back after 1 second.");
},1000);
// arbitrary loop to take up some time
for (var i = 0; i < 10000; i += 1) {
console.log(i);
}
})();
也许我并不完全理解单线程意味着什么,但我认为在所有外部匿名函数完成之前,setTimeout回调不会执行.但是,在浏览器中运行它会显示回调函数在我仍然输出到控制台时被调用.对我来说,这似乎有两个线程,匿名函数的invokation占用1个线程,然后回调使用第二个线程.
有人可以帮助我迷惑吗?
解决方法
console.log()在某些浏览器(如Chrome)中是一个奇怪的功能,并且本身不是同步的,所以你不能真正用它来衡量单线程.你可能看到的是JS引擎执行所有的console.log()语句,然后运行setTimeout()来显示警报,并且(并在其他一些非javascript的进程中)所有数据都是显示在控制台中.
Javascript确实是单线程的.在您的示例中,在完成for循环之前,setTimeout()回调将不会执行.
您可以更好地说明它:
(function () {
// throw something into event queue
setTimeout(function () {
alert("This will be called back after 1 second.");
},1000);
function Now() {
return new Date().getTime();
}
var start = Now();
// loop for 1.2 seconds
while (Now() - start < 1200) {}
alert("Looping done");
})();
工作jsfiddle演示:http://jsfiddle.net/jfriend00/3sBTb/