zoukankan      html  css  js  c++  java
  • JavaScript是单线程吗

    在一次面试中,被问到这个问题 =》 JavaScript是单线程吗

    JS在浏览器中运行,是单线程的. 每个window只有一个JS线程. 既然是单线程的,那么在某个特定的时刻,也就应该只有特定的代码才能够被执行,并阻塞其他的代码. 但是我们明明又发现,比如JQuery的AJAX异步调用,

    而我们知道,浏览器是事件驱动的(Event Driven), 浏览器中很多行为都是异步(Asynchronized)的,浏览器会创建事件并放入执行队列中. 也就是说,浏览器内部有一个事件大循环,或者说消息大循环,叫做Event Loop(事件循环), 会轮询事件队列。

    所以可以理解如下:

    JS引擎是单线程来处理它的任务队列的。比如JS单线程目前正在处理一个任务. 这个时候,发生了mouse click, a timer firing, or an XMLHttpRequest completing (需要JavaScript去处理鼠标点击事件,定时器触发事件, XMLHttpRequest回调触发等)。会把这些事件放入到Event Loop(事件循环)中,等JS当前任务执行完毕,才会去依次执行它们.

    我们来看一个经典的例子

    function foo() {
        console.log( 'first' );
        setTimeout( ( function(){ console.log( 'second' ); } ), 5);
     
    }
     
    for (var i = 0; i < 1000000; i++) {
        foo();
    }

    这段代码的执行结果会 首先全部输出first, 然后再全部输出second

    JS单线程在这里先是执行console.log('first'), 然后5毫秒后,把setTimeout这个任务加入到等待队列Event Loop中(注意: 不是5毫秒后马上执行它,而是5毫秒后把它加入到等待队列,因为现在JS单线程很忙)

    JS单线程在忙着完成当前的事情,也就是1000000次循环输出first.

    只能等1000000个first输出完后才会输出second)

  • 相关阅读:
    RS485通信和Modbus协议(转)
    Modbus通讯错误检测方法
    Modbus消息帧
    Modbus通讯两种传输方式
    echarts自定义图例legend文字和样式
    host文件的作用
    webpack --watch和supervisor的不同
    vue中如何使用echarts
    Vue父子组件生命周期
    Git总结笔记
  • 原文地址:https://www.cnblogs.com/wphl-27/p/15335214.html
Copyright © 2011-2022 走看看