1.JS的基本概念
诞生:
- 借鉴C语言的基本语法
- 借鉴Java语言的数据类型和内存管理
- 借鉴Scheme语言,将函数提升到“第一等公民”的地位
- 借鉴Self语言,使用基于原型的继承机制
- Browser进程
- GPU进程
- 渲染进程
- GUI线程
JS线程
事件触发线程
定时器触发线程
网络线程 - 插件进程、网络进程...
JS
- 单线程
- 动态、弱类型
- 面向对象、函数式
- 解释类语言(不纯)、JIT
- 安全、性能差
- ...
GUI和JS线程是互斥的
JS的基本概念-数据类型
- 基础类型: 字符串、undefined、数字、null、symbol、bigint、布尔()(简单:初始值不能被改变)
- 对象: 数组,函数(复杂:栈中存的是地址,初始值能被改变)
JS的基础概念-作用域
- 变量的可访问性和可行性
- 静态作用域,通过它就能够预测代码执行过程中如何查找标识符
- 全局作用域,函数作用域,块级作用域
JS的基本概念-变量提升
- var有变量提升
- let、const没有变量提升,提前访问会报错
- function函数可以先调用再定义
- 赋值给变量的函数无法提前调用
2.JS是怎么执行的
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文(简称EC)”,也叫执行环境。
全局执行上下文:代码开始执行的时候就会创建,将它压执行栈的栈底,每个生命周期内只有一份 函数执行上下文:当执行一个函数时,这个函数内的代码就会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出。
- 词法环境: 基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
- 变量环境: 变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和const)绑定,而后者只能来存储var变量绑定
- Outer: 指向外部环境的一个指针
JS的进阶知识点-this
普通函数的this指向windows
1.对象调用指向对象
2.先赋值再调用,看调用的地方
1.创建临时对象
2.将this指向临时对象
3.执行构造函数
4.返回临时对象