重点内容:
- 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 指向临时对象
- 执行构造函数
- 返回临时对象
垃圾回收:
- 垃圾标记
- 对象复制
- 区域反转