JS笔记

62 阅读3分钟

JS的基本概念

历史

  1. 将函数提升到第一等公民

js特点

  • 单线程(当GUI线程执行时,JS线程不执行,互斥的)
  • 动态,弱类型:在运行时才确定数据的类型,在使用之前不需要指定他的类型
  • 面向对象,函数式
  • 安全,但是性能差
  • 解释性语言:但是并不是纯解释性语言,也存在编译

数据类型

  • 复杂的数据类型中变量存的是一个地址,当两个变量共用一个地址,其中一个值改变,另一个也跟着改变
  • 基础数据类型,中原始值是不可以被改变的

作用域

变量的可访问性和可见性

  1. 静态作用域:通过它来预测代码在执行过程中如何查找标识符
  2. 全局作用域:变量是全局的
  3. 函数作用域:变量仅仅在该函数内有效
  4. 块级作用域:(存疑)?

变量提升

即在变量声明之前使用

  1. var 有变量提升,但是并没有值,打印出是 undefined
  2. let 和 const 没有, 在定义之前使用,报错
  3. 函数: 把整个函数都提升到使用之前

JS如何执行

Pasted image 20230509163257.png

  1. 字节码比机器码的代码量少的多,所以先转化为字节码文件
  2. JIT

执行上下文

当JS引擎解析到可执行的代码片段时,就会先去做一些执行前的准备工作,这个准备工作就称为执行上下文,也叫执行环境。

执行上下文 中的内容

  1. 变量环境
  2. 词法环境
  3. This
  4. 可执行代码

分为三类

  1. 全局: 代码执行时就会创建,压入执行栈的栈底每个生命周期只有一份
  2. 函数: 当执行函数时,函数内的代码被编译,生成变量环境,词法环境等,当函数执行结束时该执行环境从栈顶弹出
  3. Eval

创建执行上下文做的工作

  1. 绑定this
  2. 创建词法环境
  3. 创建变量环境
  • 词法环境:用来存储 function 函数
  • 变量环境:存储 var 和 const 变量
  • outer:指向外部变量环境的一个指针(上一级的执行上下文)

JS进阶知识点

闭包

闭包指向的是堆上的一个内存,当外部函数执行结束之后,闭包中的内存并不会被回收,所以会造成内存泄漏,闭包本质上仍是一个未释放的对象

this

  1. 普通函数中指向 window
  2. 对象调用指向对象 , 采用apply改变this指向 Pasted image 20230509172735.png

垃圾回收(堆)

  1. 新生代:(存放小内存 1-8M)
    • 对象区域:存放活跃的变量,
    • 空闲区域
    • 操作:将对象区域中活跃的变量进行垃圾标记,再将对象赋值到空闲区域中,最后将区域翻转,释放翻转后的空闲区域
  2. 老生代:(存放大内存)
    • 做一次标记,
    • 将标记的清楚掉,之后内存不连续,主垃圾回收器会对碎片空间进行整理,再变为连续的内存空间
    • 内存较大,标记清楚比较耗时,在清除时,JS引擎是停顿的(全停顿),所以主垃圾回收器 将清除操作变为碎片化的,标记一个清除一个,接着再进行下一个

事件循环

微任务对列: 宏任务对列:

  • 微任务队列先于宏任务先执行