深入理解JavaScript
JS的基本概念
作用域
静态作用域:能预测代码在执行过程中如何查找标识符 分为全局作用域、函数作用域、块级作用域 var,let可作为全局、函数使用,区别在于var有变量提升,let没有,即let作用域也可以是代码块,只在块中生效。const是常量,保证变量指向的内存地址所保存的数据不允许改动(即栈内存在的值和地址)。
变量提升
var有变量提升,在定义变量之前访问结果为undefined,let和const在定义之前访问会报错。
js也不是纯解释语言 走一行编译一行的。从可以变量提升特性看出来js也是有编译过程的
JS是怎么执行的
字节码全部转成机器码占用空间很大,所以可选择逐行解释,也可以优化代码,把多次使用的代码存起来,下次直接使用该机器码即可。
执行上下文
当JS引擎解析到可执行代码片段(通常是函数调用)的时候,就会先做一些执行前的准备工作,这个准备工作,就叫做“执行上下文 (execution context 简称也叫执行环境EC)",也叫执行环境 分为:全局执行上下文、函数执行上下文、Eval执行上下文
- 全局执行上下文: 代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期内只有一份
- 函数执行上下文: 当执行一个函数时,这个函数内的代码会被编译,生成变量环境、词法环境等,当函数执行结束的时候该执行环境从栈顶弹出
- 创建执行上下文的时候做了什么:绑定this,创建词法环境(方法和const、let变量等),创建变量环境(var变量)
- 词法环境: 基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成
- 变量环境: 变量环境和词法环境的一个不同就是后者者被用来存储函数声明和变量 (let 和 const)绑定而前者只用来存储 var 变量绑定
- Outer: 指向外部变量环境的一个指针(方法内引用方法外的变量或者方法时候就需要outer指针)
- ESP:记录当前执行状态的指针(当前方法结束时候,ESP从当前方法指向栈底的方法(函数执行上下文->全局执行上下文))
当变量指向一个地址(即为复杂变量)时,会存储在堆空间,所以我们修改复杂变量时候,也是通过地址修改空间里的内容,所以复杂变量可以被改变。
JS的进阶知识点
this
垃圾回收
老生代内存大,一般存放不常使用的,新生代内存小,存储经常取出的