js是单线程的,做完一件事,再去做另一件事
js中的编程思想:同步、异步(js在多数情况下是同步的,少数情况是异步的。)

JS是单线程环境,也就是说代码的执行是从上到下,依次执行。也就是同一个时间只能做一件事。

同步:上一件事情完成后,才会处理下一件事情。
异步:要做一件事,但并不是立刻做。而是把当前的事情处理完后,再做这件事。

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。JavaScript将所有任务分成两种,一种是同步任务,另一种是异步任务。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

在所有同步任务执行完之前,任何的异步任务是不会执行的。 而setTimeout就是一个异步任务,所以会先执行for循环这个同步任务,把setTimeout()放进任务队列中等待主线程的for循环执行完毕,一旦"执行栈"中的所有同步任务执行完毕(循环结束后此时i=10)就会从队列中取出setTimeout()
for循环一次碰到一个 setTimeout(),并不是马上把setTimeout()拿到异步队列中,而要等到一秒后,才将其放到任务队列里面。

js中仅有的4种异步编程:

  1. 定时器
  2. 事件绑定
  3. ajax读取数据
  4. 回调函数
var n = 0;
window.setTimeout(function() {
    n++
    console.log(n)//第2次输出    1
}, 1000)
console.log(n);  //第1次输出     0
var n = 0
window.setTimeout(function() {
    n++
    console.log(n) //不执行~~~~
}, 0)
console.log(n) //只输出1次   0
while (1) {
    n++;      //死循环
}
console.log(n)  //不执行
var n = 0
window.setTimeout(function() {
    n += 2
    console.log(n)  //第四次  7~~~~
}, 20)

window.setTimeout(function() {
    n += 5
    console.log(n) //第三次  5
}, 5)
console.log(n)    //第一次  0

for (var i = 0; i < 10000; i++) {}
console.log(n)    //第二次  0

image.png

异步执行的运行机制如下:~~~~
所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
主线程不断重复上面的第三步。
主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会循环反复。

麦子
23 声望3 粉丝

学习前端


下一篇 »
this