1.JS是一门单线程的语言
2.计算机中的同步异步是指:
同步就是排队等待,假如你是第一百零一个备胎,那你只能等前面的一百个爆了之后才能‘处理'你。
异步就是,尽管你是第一百零一个,她还是能照顾到你的感受。
3.JS作为单线程语言,如何实现同步和异步?
通过事件循环(event loop)实现'异步'
4.什么是异步?
可以简单地理解为:可以改变程序正常执行顺序的操作就可以看成是异步操作。最基础的异步是setTimeout和setInterval函数
console.log('1') setTimeout(function(){ console.log('2') },0) console.log('3') // 1,3,2setTimeout里的函数并没有立即执行,而是延迟了一段时间,满足一定条件后,才去执行的,这类代码,我们叫异步代码
5.JS任务分类
所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。
虽然JS是单线程的但是浏览器的内核是多线程的。
在浏览器的内核中不同的异步操作由不同的浏览器内核模块调度执行,异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不同,如 onclick, setTimeout, ajax 处理的方式都不同,这些异步操作是由浏览器内核的 webcore 来执行的,webcore 包含上图中的3种 webAPI,分别是 DOM Binding、network、timer模块。
按照这种分类方式:JS的异步执行机制是
按照这种分类方式:JS的异步执行机制是
- (1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
- (2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
- (3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
- (4)主线程不断重复上面的第三步。