JS的基本概念
起源
- 借鉴C语言的基本语法
- 借鉴Java语言的数据类型和内存管理
- 借鉴Scheme语言,将函数提升到"第一等公民”( first class)的地位
- 借鉴Self语言,使用基于原型(prototype)的继承机制
JS参考了很多语言
发展
- Mocha>1995.9 LiveScript > 1995.12 JavaScript
- 1997年6月,第一版ECMAScript发布
- 1999年12月,第三版ECMAScript发布
- 2009年12月,第五版ECMAScript发布
- 2009年,Ryan 创建了 Nodejs
- 2010年,Isaac基于nodejs写出了npm
- 2015年6月,第六版ECMAScript发布
主要要了解的内容:Nodejs;ES6
对于es6,我个人推荐的内容为:
ECMAScript 6 入门 - 《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》 - 书栈网 · BookStack
数据类型
值类型(基本类型) :字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
引用数据类型(对象类型) :对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
作用域
JavaScript采用的是静态作用域,函数定义的位置就决定了函数的作用域
变量提升
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
- var有变量提升
- let、const没有变量提升,提前访问会报错
- function函数可以先调用再定义
- 赋值给变量的函数无法提前调用
JS如何执行
下图展示了JS的执行过程
上图展现了token到AST的过程
执行上下文
当JS引解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文 ( execution context 简称EC )"也叫执行环境。
执行上下文包括:全局执行上下文、函数执行上下文、Eval执行上下文
- 全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
- 函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
词法环境与变量环境
创建执行上下文时,发生了以下事件:
- 绑定This
- 创建词法环境
- 创建变量环境
- 词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的应用外部词法环境的空值组成
- 变量环境:变量环境和词法环境的一个不同就是前者被用来存储函数声明和变量(let和contest)绑定,而后者只用来存储var变量绑定
- Outer:指向外部变量环境的一个指针