1. 深入理解js
(1)JS的基本概念
- 作用域:
变量的可访问性和可见性
静态作用域:通过它就能够预测代码在执行过程中如何查找标识符
- 变量提升:
- Var有变量提升
- Let,const没有变量提升,提前访问会报错
- Function函数可以先调用在定义
- 赋值给变量的函数无法提前调用
(2)JS是怎么执行的
-
先是源代码进行词法分析推到AST,进行语法分析推到执行上下文,在AST后推到字节码,字节码逐行解释执行到机器码,字节码编译执行(优化代码)到机器码。
-
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准工作,这个准备作业,就叫做“执行上下文”,也叫执行环境
-
全局执行上下文:代码开始执行时就会创建,将他压执行栈底,每个生命周期内只有一份
-
函数执行上下文:当执行一个函数时,这个函数内的代码就会被编译,生成变量环境,词法环境等,当函数执行结束的时候执行环境从栈顶弹出。
-
词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境纪律器和一个可能的引用外部词法环境的空值组成。
-
环境变量:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只能用来存储var变量绑定。
-
Outer:指向外部变量环境的一个指针。
(3)JS的进阶知识
-
通常,如果引用闭包的函数是一个全局变量,那么闭包会一直存在直到页面关闭;但如果这个闭包以后不再使用的话,就会造成内存泄露。
-
如果引用闭包的函数是个局部变量,等函数销毁后,在下次javascript引擎执行垃圾回收时,判断闭包这块内容,如果以及不再被使用了,那么JavaScript引擎的垃圾回收器就会回收这块内存。