wmo*_*ock 6 javascript events multithreading callback single-threaded
我一直在阅读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);
}
})();
Run Code Online (Sandbox Code Playgroud)
也许我并不完全理解单线程意味着什么,但我认为在所有外部匿名函数完成之前,setTimeout回调不会执行.但是,在浏览器中运行它会显示回调函数在我仍然输出到控制台时被调用.对我来说,这似乎有两个线程,匿名函数的invokation占用1个线程,然后回调使用第二个线程.
有人可以帮助我迷惑吗?
jfr*_*d00 11
console.log()在某些浏览器(如Chrome)中是一个奇怪的功能,并且本身不是同步的,所以你不能真正用它来衡量单线程.您可能看到的是,JS引擎执行所有console.log()语句,然后setTimeout()运行以显示警报,并且并行(在一些非javascript的其他进程中)所有数据都显示在控制台中.
Javascript确实是单线程的.在您的示例中,setTimeout()回调将在for循环完成后才会执行.
您可以更好地说明它:
(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");
})();
Run Code Online (Sandbox Code Playgroud)
工作jsFiddle演示:http://jsfiddle.net/jfriend00/3sBTb/
| 归档时间: |
|
| 查看次数: |
3069 次 |
| 最近记录: |