1、js的基本概念
- 单线程:js线程和gui线程互斥
- 动态弱类型语言:在运行时才确定数据类型的语言
- 面向对象、函数式:js都有混在一起,可以面向对象,也可以函数式编程
- 解释类语言,JIT运行:
- 安全、性能差:依赖于宿主环境
2、数据类型
2.1 基础数据类型
七种:
- 字符串
- undefined
- null
- 数字
- 布尔
- Symbol
- bigint
2.2 复杂数据类型
对象:包括数据,函数等等
2.3 复杂和基础数据类型的区别
复杂数据类型是引用地址
基础数据类似赋值的是原始值,原始值不可以被改变
3、作用域
js作用域是静态作用域,通过它就能预测在执行过程中如何查找标识符
全局作用域
函数作用域
块级作用域
4、变量提升
-
var有变量提升,在定义之前执行不会报错,值为undefined
-
let和const不会变量提升,提前访问会报错
-
函数也会出现变量提升的情况,因此function可以先调用再定义
-
赋值给变量的函数无法提前调用
js也是有一个编译过程的
5、js执行过程

AST先转变为字节码,再逐行解释执行机器码
相同代码执行两次,V8会直接将字节码编译为机器码,后面直接执行机器码
执行上下文
JS引擎解析到可执行代码片段的适合,会先做执行前的准备工作,这个准备工作就是执行上下文
全局执行上下文:代码开始执行就会创建,压入执行栈栈底,每个生命周期内只有一份
函数执行上下文:执行一个函数,函数内代码会被编译生成变量环境,执行结束该执行环境从栈顶弹出。
Eval执行上下文

执行上下文相关的步骤:
-
绑定this
-
创建词法环境
-
创建变量环境

变量环境放var,词法环境放let、const和函数
会逐级往外层找变量
一层一层形成作用域链
闭包
把变量藏在函数中里,并且返回一个新的函数

闭包里的函数不容易被回收
this
- 普通函数的this指向的是window
- 对象调用的时候,this指向的是对象
- apply call bind改变this指向
- 在构造函数中,this指向临时对象
- 箭头函数中的this,指向箭头函数定义时的上下文
JS中的垃圾回收
栈的垃圾回收,使用ESP指针
堆的垃圾回收
新生代空间,老生代空间
大概流程和操作系统里的内存回收类似
事件循环
js引擎单线程
微任务:setTimeout
宏任务:Promise.then
执行顺序:同步代码,微任务,宏任务
微任务队列执行完,再执行宏任务
如果执行宏任务的过程中,创建了很多微任务,下一次事件循环,会先将微任务执行完,再执行宏任务
课程总结
- JS是单线程的,但是Render进程里有多个线程
- JS线程和GUI线程互斥,执行大的计算任务会导致页面卡顿
- 基础数据类型存在栈上,复杂数据类型存在堆上
- const、let没有变量提升,提前使用会报错
- JS也有编译的过程,执行之前会生成执行上下文
- 一个执行上下文包括变量环境、词法环境、this
- 变量环境里面有一个指向外部函数执行上下文的指针,形成了作用域链
- 全局执行上下文只有一份
- this和执行上下文绑定