深入理解 JS | 青训营笔记

80 阅读2分钟

重点内容:

  • JS 基本概念
  • JS 数据类型
  • 变量提升
  • 作用域
  • 闭包
  • 垃圾回收

详细知识点介绍:

JS 基本概念:

诞生:

1995年,Brendan Eich开发,借鉴了C、java、Scheme、Slef四种语言

特点:

  • 单线程
  • 动态、弱类型
  • 面向对象、函数式
  • 解释类语言、JIT
  • 安全、性能差

作用域:

变量的可访问性和可见性
静态作用域,通过它能预测代码在执行过程中如何查找标识符

全局作用域:

var company = "bytedance";

function showCompany() {
  console.log(company)
}

showCompany()

函数作用域:

var company = "bytedance";

function showCompany() {
  company = "douyin"
  console.log(company)
}

showCompany()

块级作用域:

{
  const company = "bytedance";
  console.log(1, company)
}
 console.log(2, company)

变量提升:

  • var 有变量提升
  • let、const 没有变量提升,提前访问会报错
  • function 函数可以先调用再定义
  • 赋值给变量的函数无法提前调用

JS 执行过程:

graph TD
源代码 --> AST --> 字节码 --> 机器码

执行上下文:

当JS 引擎解析到可执行代码片段(通常是函数调用)时,会先做一些执行前的准备工作,这个准备工作,被称为 执行上下文,也叫 执行环境

  • 全局执行上下文:代码开始执行时会创建,将他压执行栈的栈底,每个生命周期内只有一份
  • 函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束时,该执行环境从栈顶弹出
  • 词法环境:基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由 环境记录器 和 一个可能的引用外部词法环境的空值组成
  • 变量环境:和词法环境的不同在于,前者被用来存储函数声明和变量绑定,后者只用来存储 var 变量绑定
  • Outer:指向外部变量环境的一个指针

闭包:

通常,如果引用闭包的函数是全局变量,那么闭包会一直存在,直到页面关闭;但如果这个闭包以后不再使用,会造成内存泄漏。
如果引用闭包的函数是局部变量,等函数销毁后,在下次 JavaScript 引擎执行垃圾回收时,判断闭包这块内容如果已经不再使用,垃圾回收器就会回收这块内存

this:

普通函数的this,指向windows image.png
  1. 对象调用指向对象
  2. 先赋值再调用,看调用的地方
image.png
  1. 创建临时对象
  2. 将 this 指向临时对象
  3. 执行构造函数
  4. 返回临时对象

垃圾回收:

  1. 垃圾标记
  2. 对象复制
  3. 区域反转