事件循环—eventloop
js是单线程的。也就是说,同一个时间只能做一件事。作为浏览器脚本语言,与它的用途有关。
JavaScript的主要用途是和用户互动,以及操作DOM。这决定了它只能是单线程。
比如有一个添加节点,一个删除节点,肯定不能同时进行,还没添加怎么删除呢,所以是先添加DOM节点后删除DOM节点。
有些任务是耗时的,会阻塞代码的执行:
console.log(1)
setTimeout(function () {
console.log(2)
},2000)
console. 1og(3)
我们可以把代码分为同步代码(同步任务)和异步代码(同步代码)
同步代码:
console.log(1)
console. 1og(3)
同步代码:
setTimeout(function () {
console.log(2)
},2000)
异步代码除了setTimeout(一次性定时器)还有:
setlnterval(定时器)
jax/Fetch
事件绑定
异步代码的共同特点都是耗时的
重点:
同步代码:立即放入JS引擎(JS主线程)执行,,并原地等待结果
异步代码:先放入宿主环境(浏览器/Node),不必原地等待结果,并不阻塞主线程继续往下执行,异步结果在将来执行
执行过程:
执行栈只要一执行完,就会反复到任务队列里面去看,有没有异步的任务需要去执行,执行栈到任务队列里面反复查找的过程就叫做事件循环
总结:
1.JS是单线程,防止代码阻塞,我们把代码(任务):同步和异步
2.同步代码给js引擎执行,异步代码交给宿主环境
3.同步代码放入执行栈中,异步代码等待时机成熟送入任务队列排队
4.执行栈执行完毕,会去任务队列看是否有异步任务,有就送到执行栈执行,反复循环查看执行,这个过程是事件循环(eventloop)
事件循环-宏任务和微任务
代码可能有3种:执行顺序依次往下
1.同步代码(js 执行栈/回调栈)
2.微任务的异步代码(js引擎)
process.nextTick ( node)
Promise.then() catch()
Async/Await
object.observe等等
Promise本身同步, then/catch的回调函数是异步的微任务
3.宏任务的异步代码(宿主环境)
script(代码块)
setTimeout/setInterval定时器
setImmediate定时器
什么是原型和原型链?
原型:每个函数都有prototype属性称之为原型,因为这个属性的值是个对象,也称为原型对象
作用:
1.存放一些属性和方法
2.在JavaScript中实现继承
proto:每个对象都有_proto_属性
作用:这个属性指向它的原型对象
1.原型:函数都有prototype属性