一、JS的基本概念
1. 数据类型
对象:数组、函数
基础类型:字符串、undefined、数字、null、symbol、bigInt、布尔 \
2. 作用域
变量的可访问性和可见性
静态作用域
通过它就能够预测代码在执行过程中如何查找标识符
3. 变量提升
var 定义 有变量提升
let const 没有变量提升,提前访问会报错
function 函数可以先调用后定义
赋值给变量的函数无法提前调用
二、JS是怎样执行的
当 JS 引擎解析到可执行代码片段(通常是函数调用的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文 ( execution context 简称EC ) ”,也叫执行环境。
- 全局执行上下文: 代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
- 函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
- 词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
- 变量环境:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只用来存储var变量绑定
- Outer:指向外部变量环境的一个指针
三、闭包
- 闭包(Closure)是指一个函数能够访问在其定义时的词法作用域之外的变量。
- 当函数执行完毕后,它的词法作用域会被销毁,其中定义的变量和函数也会被销毁。但是,如果一个内部函数(嵌套函数)在外部函数执行完毕后仍然可以访问外部函数的变量和参数,那么这个内部函数就形成了一个闭包。