深入理解JavaScript
JavaScript的基本概念
- 诞生:
- 借鉴了C语言的基本语法
- 借鉴了Java语言的数据类型和内存管理
- 借鉴Scheme语言的函数式编程
- 借鉴了Self语言使用基于原型的继承机制
JavaScript的数据类型
- 基础类型:
- undefined
- null
- symbol
- bigInt
- 字符串
- 数字
- 布尔
- 对象:
- 数组
- 函数
JavaScript的作用域
作用域规定了变量的可访问性和可见性
- 全集作用域:变量在全部代码段都可以访问
- 函数作用域:变量在函数内可以使用
- 块级作用域:让变量只在特定的代码块生效
变量提升
变量提升:在JavaScript代码执行时,将变量和函数的声明部分提升到代码开头
- 注意事项:
- 不是所有类型都有变量提升,var有变量提升,但是let和const没有变量提升
- function函数有变量提升,可以先调用再声明
- 为变量赋值的函数无法提前调用
JavaScript的执行过程
- JS源代码经过词法分析生成AST
- 经过语法分析生成执行上下文,也称为执行环境
- 将AST转化为字节码
- 字节码直接逐行解释执行形成机器码
- 或经过编译和优化形成机器码
- 全局执行上下文:在代码开始执行时创建,压入执行栈的栈底,每个生命周期只有唯一一份
- 函数执行上下文:每执行一个函数,函数内代码进行编译生成环境变量、词法环境,函数执行时压入栈,执行结束后函数执行环境从栈顶弹出
创建执行上下文
- 绑定This:在全局执行上下文中,this指向全局变量;在函数执行上下文中,this取决于函数的调用方式,指向被函数调用的对象或全局对象
- 创建词法环境:词法环境包含标识符变量映射,标识符指声明的函数名称,变量指对于实际对象或原始值的引用
- 创建变量环境:用来存储var变量的绑定关系
个人思考与总结
Q:函数作用域和块级作用域有什么不同?
A:函数作用域是变量作用于函数范围内的代码及其嵌套函数范围内的代码;块级作用域一般保持在一对花括号之内,不仅可以作用在函数内部,也可以作用于if语句和for语句等的花括号之内。
Q:词法环境和变量环境有什么区别?
A:词法环境关注函数声明和变量的绑定;变量环境只关注var变量的绑定。