JS的基本概念
历史
- 将函数提升到第一等公民
js特点
- 单线程(当GUI线程执行时,JS线程不执行,互斥的)
- 动态,弱类型:在运行时才确定数据的类型,在使用之前不需要指定他的类型
- 面向对象,函数式
- 安全,但是性能差
- 解释性语言:但是并不是纯解释性语言,也存在编译
数据类型
- 复杂的数据类型中变量存的是一个地址,当两个变量共用一个地址,其中一个值改变,另一个也跟着改变
- 基础数据类型,中原始值是不可以被改变的
作用域
变量的可访问性和可见性
- 静态作用域:通过它来预测代码在执行过程中如何查找标识符
- 全局作用域:变量是全局的
- 函数作用域:变量仅仅在该函数内有效
- 块级作用域:(存疑)?
变量提升
即在变量声明之前使用
- var 有变量提升,但是并没有值,打印出是
undefined - let 和 const 没有, 在定义之前使用,报错
- 函数: 把整个函数都提升到使用之前
JS如何执行
- 字节码比机器码的代码量少的多,所以先转化为字节码文件
- JIT
执行上下文
当JS引擎解析到可执行的代码片段时,就会先去做一些执行前的准备工作,这个准备工作就称为执行上下文,也叫执行环境。
执行上下文 中的内容
- 变量环境
- 词法环境
- This
- 可执行代码
分为三类
- 全局: 代码执行时就会创建,压入执行栈的栈底每个生命周期只有一份
- 函数: 当执行函数时,函数内的代码被编译,生成变量环境,词法环境等,当函数执行结束时该执行环境从栈顶弹出
- Eval
创建执行上下文做的工作
- 绑定this
- 创建词法环境
- 创建变量环境
- 词法环境:用来存储 function 函数
- 变量环境:存储 var 和 const 变量
- outer:指向外部变量环境的一个指针(上一级的执行上下文)
JS进阶知识点
闭包
闭包指向的是堆上的一个内存,当外部函数执行结束之后,闭包中的内存并不会被回收,所以会造成内存泄漏,闭包本质上仍是一个未释放的对象
this
- 普通函数中指向 window
- 对象调用指向对象 , 采用apply改变this指向
垃圾回收(堆)
- 新生代:(存放小内存 1-8M)
- 对象区域:存放活跃的变量,
- 空闲区域
- 操作:将对象区域中活跃的变量进行垃圾标记,再将对象赋值到空闲区域中,最后将区域翻转,释放翻转后的空闲区域
- 老生代:(存放大内存)
- 做一次标记,
- 将标记的清楚掉,之后内存不连续,
主垃圾回收器会对碎片空间进行整理,再变为连续的内存空间 - 内存较大,标记清楚比较耗时,在清除时,JS引擎是停顿的(全停顿),所以
主垃圾回收器将清除操作变为碎片化的,标记一个清除一个,接着再进行下一个
事件循环
微任务对列: 宏任务对列:
- 微任务队列先于宏任务先执行