一、js延迟加载的方式(async defer),二者区别?
1.外部链接async、defer都可以实现延迟加载js
2.二者区别?
- defer:
-
- 顺序:html全部解析之后才会执行js脚本。
- 多个defer属性的script标签:顺次执行js脚本。
- async:
-
- js脚本下载完后就开始执行js代码。
- 多个async属性的script标签:顺序不一定,谁先加载完谁执行。==》如果存在依赖关系,如等a.js加载完再加载b.js则不可使用async。
补充:
- 绿色:解析HTML,构建DOM树
- 紫色:脚本下载
- 红色:执行js代码
- 灰色:不执行
二.”==“和‘===’有什么区别?
- 前者只是比较值的相等性,因为可以使用valueOf进行隐式转换,并不会显示到代码中
- 后者除了比较值,还会进行类型的比较
三、js的宏任务和微任务
- 单线程:同一时间只能做一件事,如何执行异步代码呢?
- 事件循环机制(异步执行代码机制)
补充:js执行流程:先同步===》再事件循环(宏任务、微任务):先执行微任务,再执行宏任务(每次执行宏任务之前保证微任务队列是清空的)
- 微任务:promise.then
- 宏任务:定时器
四.JS的作用域考题
1.函数有块级作用域
2.作用域链:内部可以访问外部变量(逐一向上去找),但是外部不可以访问内部作用域
3.注意是var定义还是window.定义,如果函数内是window.b,则再函数外也能访问到。
4.关于变量提升:悬挂,
面试做题顺序:
1.先看本层作用域有没有此变量,注意变量提升
2.只要有var ,本层作用域就有变量,变量提升会一直悬挂在本层函数作用域
3.优先级:声明变量>声明普通函数>参数>变量提升