个人收藏的文章
JS是单线程语言
很重要
对应讲得比较好的文章
也就是说JS的事件要排队执行,但是我们要注意同步任务和异步任务,至于哪些是异步任务哪些是同步任务就要靠平时的积累或者上网查。
当我们打开网站时,网页的渲染过程就是一大堆同步任务,比如页面骨架和页面元素的渲染。而像加载图片音乐之类占用资源大耗时久的任务,就是异步任务
常见的setTimeout就是异步任务,JS遇到他会先把他放到even table,先执行主线程的同步任务,同步任务执行完以后才执行异步任务
判断是同步还是异步
同步
- 放进主线程执行
- 执行完后看even queue(异步任务准备就绪队列),如果有就把队列移到主线程执行
异步
- 放进even table(异步执行队列),当满足条件,就放进even queue(异步任务准备就绪列表) ,例如setTimeout({function( ){ }},3000)设置3s后执行,当3s后就放入even queue。
- 在even queue里的事件会等主线程的事件执行完了才能执行,然后又重复循环。
宏任务与微任务
执行机制是先执行一段宏任务,注意是一段,script是宏任务,也就是说先执行script里的所有事件,然后遇到同步任务就直接执行,异步任务就放在宏任务的even table然后满足条件放到even queue(这是宏任务的even queue,一定要注意),等这个宏任务执行完后会去查看执行过程中遇到的微任务,执行完后再执行宏任务,如此循环。
JavaScript的7种数据类型
1:number(数字),2:boolean(布尔),3:string(字符串),4:undefined(未定义),5:null(空),6:symbol(ES6新增),7:object(对象)
闭包
定义在一个函数里的函数就是闭包
一句话来概括就是:能够读取其他函数内部变量的函数