深入理解JS | 青训营笔记

66 阅读3分钟

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执行过程

image-20230425132610645

AST先转变为字节码,再逐行解释执行机器码

相同代码执行两次,V8会直接将字节码编译为机器码,后面直接执行机器码

执行上下文

JS引擎解析到可执行代码片段的适合,会先做执行前的准备工作,这个准备工作就是执行上下文

全局执行上下文:代码开始执行就会创建,压入执行栈栈底,每个生命周期内只有一份

函数执行上下文:执行一个函数,函数内代码会被编译生成变量环境,执行结束该执行环境从栈顶弹出。

Eval执行上下文

image-20230425133455595

执行上下文相关的步骤:

  1. 绑定this

  2. 创建词法环境

  3. 创建变量环境

image-20230425133609718

变量环境放var,词法环境放let、const和函数

会逐级往外层找变量

一层一层形成作用域链

闭包

把变量藏在函数中里,并且返回一个新的函数

image-20230425134628214

闭包里的函数不容易被回收

this

  • 普通函数的this指向的是window
  • 对象调用的时候,this指向的是对象
    • apply call bind改变this指向
  • 在构造函数中,this指向临时对象
  • 箭头函数中的this,指向箭头函数定义时的上下文

JS中的垃圾回收

栈的垃圾回收,使用ESP指针

堆的垃圾回收

新生代空间,老生代空间

大概流程和操作系统里的内存回收类似

事件循环

js引擎单线程

微任务:setTimeout

宏任务:Promise.then

执行顺序:同步代码,微任务,宏任务

微任务队列执行完,再执行宏任务

如果执行宏任务的过程中,创建了很多微任务,下一次事件循环,会先将微任务执行完,再执行宏任务

课程总结

  1. JS是单线程的,但是Render进程里有多个线程
  2. JS线程和GUI线程互斥,执行大的计算任务会导致页面卡顿
  3. 基础数据类型存在栈上,复杂数据类型存在堆上
  4. const、let没有变量提升,提前使用会报错
  5. JS也有编译的过程,执行之前会生成执行上下文
  6. 一个执行上下文包括变量环境、词法环境、this
  7. 变量环境里面有一个指向外部函数执行上下文的指针,形成了作用域链
  8. 全局执行上下文只有一份
  9. this和执行上下文绑定