作用域定义
- 作用域是指js代码中定义变量的区域
- 作用域规定了查找变量的方式,确定了当前执行代码对变量的访问权限
作用域又分全局作用域和局部作用域
- 全局作用域就像所有作用域的祖籍作用域,是所有局部作用域都可以访问到的,包括自己。
- 局部作用域可以访问的变量的权限只有祖籍作用域和自己的作用域,无法访问到自己内部的局部作用域
静态作用域
静态作用域指的是一段代码,在它执行前就已经确定了它的作用域,意思就是在执行前就确定了它可以应用哪些地方的作用域(变量)
js运行代码的三个步骤
- 语法分析
- 预编译
- 解析执行
语言分析
代码执行前的准备工作
语言分析阶段:准备要执行的一段js代码,检查是否存在语法错误,存在则抛出错误,代码不执行。
预编译
预编译分为全局预编译和局部预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻
tip: 预编译阶段发生变量声明提升和函数声明提升,没有进行初始化赋值的操作,匿名函数不参与预编译。只有在解析执行阶段才会进行变量初始化赋值
全局预编译的三个步骤
- 创建GO对象(Global Object) 全局对象。
- 找变量声明,将变量名作为GO对象的属性名,值为undefined
- 查找函数声明,作为GO属性名,值赋予函数体function(){}
局部预编译的四个步骤
- 创建AO对象(Activation Object)
- 找形参和变量声明,将形参和变量作为AO属性名,值为undefined
- 将实参和形参相统一
- 在函数体里面找函数声明作为属性名,值赋予函数体。
tip:函数执行完毕AO销毁
解析执行
- js引擎执行代码是从上往下一段一段分析执行的。对GO或者AO中属性重新赋值过程
- 函数执行完毕时,AO销毁。
- 浏览器关闭时,GO销毁。