JS的特点
- 单线程
- 动态、弱类型
- 动态语言(弱类型):运行时才确定数据类型,变量在使用之前无需申明类型
- 静态类型(强类型):编译时需要确定变量的数据类型
- 面向对象 函数式
- 纯函数:相同的输入,总是会的到相同的输出,并且在执行过程中没有任何副作用
- 原型、继承、封装
- 解释类语言(实际上JS并不是纯的解释执行语言,也是会经过编译的) JIT(即时编译)
- 安全、性能差
JS的数据类型
复杂数据类型: Object、Array、Date等,真正的对象实例存放在堆空间中
基础数据类型:数据直接存放在变量(栈空间)中
作用域
变量的可访问性和可见性;JS为静态作用域
- 全局作用域
- 函数作用域
- 块级作用域
变量提升
- var有变量提升
- let 和 const 没有变量提升
- function函数可以先调用再定义
- 赋值给变量的函数无法提前调用
JS如何执行
- 源代码通过语法分析和词法分析生成抽象语法树AST与执行上下文
- AST转化为字节码,然后逐行解释执行为机器码
- 热代码(相同的代码出现两次及以上)优化
执行上下文:当JS引擎解析到可执行代码片段的时候所做的准备工作,也叫执行环境,包括:
- 变量环境:用来存储函数声明和变量(let 和 const)绑定
- 词法环境:存储var变量绑定
- this
- 可执行代码
- outer:指向外层变量环境的指针
全局执行上下文:代码开始执行时创建,位于执行栈底,每个生命周期内只有一份
函数执行上下文:当执行函数时创建,执行结束后从栈顶弹出
闭包
闭包就是指有权访问另一个函数作用域中的变量的函数,在一个函数内部创建另一个函数时则产生闭包
缺点:内存不容易被回收,容易导致内存泄漏
this的指向
- 普通函数的this指向window
- 对象调用时this指向对象;先赋值再调用看调用的地方
垃圾回收
- 新生代空间(1M-8M):对象区域 空闲区域
- 老生代:较大内存的变量或新生代空间中经历两轮垃圾回收仍未回收的变量
总结
本节课主要对JS的基础概念做了总结,不过语法部分并没有介绍,学的太久有很多都没啥印象了,后面需要抽时间复习一下