单线程,也就是说,同一个时间只能做一件事。这是因为JavaScript这门脚本语言诞生的使命所致——为处理页面中用户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进性添加,之后再删除。

        单线程意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务,这样所导致的问题是;如果js执行时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。(目前这个问题已经解决了,允许JavaScript创建多个线程)

同步和异步

同步:前一个任务结束再执行后一个任务;异步:在执行一件事时可以处理其他事情。

同步任务:同步任务都在主线程上执行,形成一个执行栈。

异步任务:js的异步是通过回调函数实现的;一般而言,异步任务有三类:普通事件,如click,resize等;资源加载,如load、error等;定时器,包括setInerval、setTimeout等。异步任务相关回调函数添加到任务队列中。

console.log(1);

        setTimeout(function() {

            console.log(3);

        }, 0);

        console.log(2);

如上:输出1,setTimeout(fn,0).输出2是同步任务在主线上执行,里面函数输出3是异步任务。

执行机制

  1. 先执行执行栈中的同步任务。
  2. 异步任务(回调函数)放入任务队列中。
  3. 一旦栈中的同步任务执行完毕,系统就按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态。进入执行栈,开始执行。
console.log(1);
        document.onclick = function() {//所有异步任务先提交到异步进程处理
            console.log('click'); 
        }//当完成点击后,fn才通过 异步进程 加入到任务队列中
        console.log(2);
        setTimeout(function() {
            console.log(3)
        }, 3000)//当3秒过去fn才通过 异步进程 加入到任务队列中

事件循环。


祝你学习快乐!