函数的作用域和执行上下文
执行上下文
- 执行上下文
- 当前代码的运行环境
- 作用:保存当前代码运行时所需要的数据
- 在全局环境、函数环境中会创建执行上下文
- 函数执行时创建;当一个函数调用时,一个新的执行上下文就会被创建
- 执行上下文栈
- 按照函数的调用顺序来管理执行上下文
- 栈底永远是全局上下文,栈顶是当前正在执行的函数
- 特点:先进后出
- 生命周期
- 执行上下文的生命周期
- 创建(解析)阶段:–作用域链确定 创建变量对象(声明提升规则)
- 执行阶段:修改变量对象
- 等待回收阶段
- 执行上下文的生命周期
- 每个执行上下文都有一个与之关联的变量对象(VO)和一个作用域链(scopechain)
- return语句
- 返回值
- 终止函数执行(销毁当前执行上下文,弹出执行上下文栈 )
变量对象
- 定义
- 与执行上下文相关的数据作用域
- 与上下文关联的特殊对象,用于存储被定义在上下文中的变量和函数声明
- 创建过程
- 建立 arguments 对象
- 检查当前上下文的函数声明
- 检查当前上下文中的变量声明
- 浏览器中全局上下文的变量对象
- 变量对象就是 window 对象
- 在页面关闭前一直存在
作用域链
-
作用域
- 作用域是一套关于如何存储变量当中的值,并且能在之后对这个值进行访问和修改的规则
-
作用域的作用
- 指定变量与函数的可访问范围
- 控制着变量与函数的可见性
-
作用域类型
- 全局作用域
- 在全局作用域下声明的变量叫做全局变量
- 全局作用域中无法访问到局部作用域中的变量
- 全局变量创建方式
- 在全局作用域下 var 声明的变量
- 在函数内部,没有使用 var关键字声明直接赋值的变量
- 使用 window 全局对象创建的属性和方法
- 函数作用域
- 在函数作用域下声明的变量叫做局部变量
- 局部变量只在当前函数内部中使用
- 局部作用域中可以访问到全局作用域中的变量
- 局部变量创建方式
- 在函数内部通过 var 声明的变量
- 函数的形参
- 块作用域
- { } 中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,称为块级作用域
- ES5 没有块作用域,在 ES6 中添加了块作用域
- 全局作用域
-
作用域模型
- 词法作用域(静态性) —— JavaScript 作用域
- 由函数定义的书写位置决定的,与调用位置无关
- 静态性,静态结构决定了一个变量的作用域
- 动态作用域(动态性) —— 仅由调用位置决定
- 词法作用域(静态性) —— JavaScript 作用域
-
[[scope]]属性
- 虚拟属性,无法问问和修改
- 函数创建(定义)时生成的属性,保存着这个函数所有父级执行上下文环境中的变量对象的集合
-
作用域链(scopechain)
-
由当前执行环境与所有父级执行环境的一系列变量对象组成
-
ScopeChain = VO + [[scope]]
-
-
提供对变量和函数访问的权限和顺序的规则
-
-
变量函数访问规则
- 沿着作用域链从里向外查找
- 查找会在找到第一个匹配的标识符时停止
内存空间管理
- 内存空间管理
- 分配内存
- 使用分配到的内存
- 不需要时释放内存
- 垃圾回收机制
- 当一个值失去引用之后就会回收