JS的基本概念
诞生:1995年,Brendan Eich开发
1. 借鉴C语言的基本语法
2. 借鉴Java语言的数据类型和内存管理
3. 借鉴Scheme语言,将函数提升到“第一等公民”的地位
4. 借鉴Seif语言,使用基于原型(prototype)的继承机制
发展:
1.Mocha->1995.9 LiveScript >1995.12 JavaScript
2.1997年6月,第一版ECMAScript发布
3.1999年12月,第三版ECMAScript发布
4.2009年12月,第五版ECMASript发布
5.2009 年,Ryan 创建了 Node.js
6.2010年,Isaac基于nodejs写出了npm
7.2015年6月,第六版ECMAScript发布
数据类型
graph TD
A(数据类型) --> B(对象)
B --> C(数组)
B --> D(函数)
B --> E(...)
A --> F(基础类型)
F --> G([字符串])
F --> H([undefined])
F --> I([数字])
F --> J([null])
F --> K([symbol])
F --> L([bigint])
F --> M([布尔])
作用域
变量的可访问性和可见性
静态作用域,通过它能够预测代码在执行过程中如何查找标识符
变量提升
- var有变量提升
- let、const没有提升,提前访问会报错
- function函数可以先调用再定义
- 赋值给变量的函数无法提前调用
JS是怎样执行的
当JS引擎解析到可执行代码片段 (通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文 (
execution context 简称EC)",也叫执行环境
全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
创建执行上下文
-
绑定This
-
创建语法环境
-
创建变量环境
-
词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成 -
变量环境:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量 (let和 const)绑定而后者只用来存储 var变量绑定 -
Outer:指向外部变量环境的一个指针
JS的进阶知识点
闭包
特性:
- 函数嵌套函数
- 函数内部可以引用函数外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
函数作为返回值
闭包作为参数传递
详细可参考彻底理解js中的闭包(好处和坏处) - 掘金 (juejin.cn)