理解JavaScript的单线程特性

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/