理解JavaScript的单线程特性

前端之家收集整理的这篇文章主要介绍了理解JavaScript的单线程特性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在阅读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/

猜你在找的JavaScript相关文章