美文网首页
js中for循环的阻塞机制

js中for循环的阻塞机制

作者: 段煜华 | 来源:发表于2020-05-04 20:20 被阅读0次

关于js的阻塞机制,可以看下面一段代码,一般我们会认为,这段代码会log出来0,1,2

for(var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, i * 1000);
}

而实际上,这段代码log出来的结果是 3,3,3;具体原因是因为for循环的阻塞机制。在上面的代码中,setTimeout这个定时器需要等待for循环 执行完成,而for循环执行完成了之后,i已经为3了,此时才开始执行setTimeout,因此console.log(i)会是3。
由于浏览器是事件驱动的(Event driven),因此浏览器中很多行为是异步(Asynchronized)的,很容易有事件被同时或者连续触发。当异步事件发生时,会创建事件并放入执 行队列中,等待当前代码执行完成之后再执行这些代码,如鼠标点击事件发生、定时器触发事件发生、XMLHttpRequest完成回调这些事件,都会被放 入执行队列中等待。
其实,阻塞作为js引擎的处理方式,我们最好不要想着解决“阻塞”,而是让我们想执行的代码,插入到“主线程”中。代码如下:

for(var i = 0; i < 3; i++) {
    (function(i) {
        setTimeout(function() {
            console.log(i);
        }, i * 1000);
    })(i)
}

再上面的代码中,我们加了一个立即执行的匿名函数,并且将for循环的i作为实参传入进去。这样,setTimeout就会被立即执行,而不会等待

相关文章

  • js中for循环的阻塞机制

    关于js的阻塞机制,可以看下面一段代码,一般我们会认为,这段代码会log出来0,1,2 而实际上,这段代码log出...

  • JS事件循环(Event Loop)

    js中的事件循环是JavaScript代码在浏览器运行中的一种机制,是解决JavaScript单线程运行时不会阻塞...

  • 前端干货:JS的执行顺序

    JS的运行机制 先来一个今日头条的面试题 1. 单线程的JavaScript js是单线程的,基于事件循环,非阻塞...

  • 事件循环机制

    事件循环(evenloop) 事件循环机制是宿主环境提供的。js中处理异步,增加了任务队列的概念(你不知道的js中...

  • javascript异步详解1:事件循环机制EventLoop

    一. js运行机制 js是单线程,但是存在同步【阻塞】和异步【非阻塞】执行模式 同步:从上到下、从左到右的⽅式执⾏...

  • css加载会造成阻塞吗

    结论: css不会阻塞js的解析 css会阻塞js的渲染 css会阻塞js的执行 如果页面中同时存在css和js,...

  • nodejs(三)

    什么是事件循环 Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开...

  • JavaScript 04 (do...while循环/for

    js循环,js循环嵌套,js do...while循环,js的for循环,js中的break,js中的contin...

  • 浅析Nodejs Event Loop

    什么是事件循环(Event Loop) 事件循环能让 Node.js 执行非阻塞 I/O 操作,尽管JavaScr...

  • 2019-03-28

    JS 事件循环机制 - 任务队列、web API、JS主线程的相互协同 这篇文章的核心是分析js的事件循环,在此我...

网友评论

      本文标题:js中for循环的阻塞机制

      本文链接:https://www.haomeiwen.com/subject/efzyghtx.html