一.什么是闭包?
二.作用域
1.js 作用域有
全局作用域、函数外部 var 或 未定义
局部作用域、函数内部 var
块级作用域、 es6 新概念 let ,es5 因 没有 let, 块外 和 块内 出现相同变量时,会出现变量污染
var a = 1; { var a = 2 }; console.log(a) ;// 2
2.作用域链
当函数被执行时,会从函数内部开始向上查找变量,函数内部找不到变量,则在定义函数的作用域中寻找变量,依次向上
三.原型链
四.运行机制
1.任务队列?
主线任务队列一直执行 ,(1)遇到 宏任务 放宏任务队列,(2)遇到微任务追加到微任务队列,主线队列执行完后 ,(3)依次执行微任务队列中的事件 ,且进行(1),(2)直到微任务队列为空时, 浏览器渲染页面
当宏任务队列中,某个宏任务运行时机到时,将宏任务放进主线任务队列 再次按照上述机制运行
2.宏任务(macrotask),及有哪些?
script 整体代码,setTimeout,setInterval,UI交互事件,I/O,MessageChannel,PostMessage
3.微任务(microtask),及有哪些?
Promise.then , await后面的代码是microtask
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
//等价于
async function async1() {
console.log('async1 start');
Promise.resolve(async2()).then(() => {
console.log('async1 end');
})
}
五、浏览器渲染工作流程 & 重绘(repaint) & 重排(reflow) & 如何优化?
遗留待研究问题:
1.setTimeout、Promise、Async/Await 的区别
2.Async/Await 如何通过同步的方式实现异步
3.node 事件循环