我一直在阅读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/