1.闭包
1.1闭包的概念
闭包是函数创建时所处的作用域中的函数和变量,通过闭包可以访问创建闭包时环境中的全部变量
1.2闭包的功能
闭包可以实现以下功能:通过构造函数的内部变量及构造方法模拟对象的私有属性。处理回调函数,简化代码。
2.词法环境(作用域)
2.1变量
在JS中可以定义全局、函数和块级别的变量
const和let与var的区别:可变性和与词法环境的关系
2.1.1 可变性
- const
用于不需要重新赋值的变量或者固定变量,不能赋值,但是可以修改属性(对象)或者增加长度(数组) - let和var
均可自由改变变量值
2.1.2 与词法环境的关系
- var
在距离最近的函数或是在全局词法环境中定义 - let和const
在距离最近的词法环境中定义(可能在块级作用域、循环、函数或全局环境内)
3.词法环境中注册标识符
JS并不是逐行执行的,而是分两个阶段:
- 创建了新的词法环境
- 执行第一阶段
注册当前词法环境的变量和函数 - 第二阶段
接连判断:
①是否是函数环境(是的话创建形参和arguments,不是跳过)
②是否是全局或函数环境(是的话注册函数声明(不包括箭头和函数表达式),不是的话(块级作用域)跳过)
③是否是块级作用域(是的话注册当前块的let和const,不是的话找到当前函数var变量和块外的let和const)
PS:这样两个阶段的好处是可以在声明之前调用,但是不适用于表达式和箭头函数,因为他们是在执行过程中定义的。