作用域与作用域链
执行环境中变量或函数的作用范围,作用域定义变量或函数有权访问的其他数据,作用域都有一个变量对象。
全局作用域
- 当打开页面时被创建,关闭页面时销毁
- 定义在全局中的变量,在任意作用域中都可以访问
- 全局变量和函数都是作为window对象的属性和方法
局部(函数作用域)
- 函数调用时,函数作用域被创建,函数执行完毕时,函数作用域被销毁
- 每调用一次函数就会创建一个新的函数作用域,相互之间是独立的
- 函数作用域可以访问上层作用域,但相邻函数作用域是独立的
块级作用域
es6前不存在块级作用域
1、通过let和const声明会形成块级作用域,与其他作用域一样,对外不可见。(scope 作用域链 Global local block)
作用域链
作用:保证对执行环境中变量和函数的有序访问
var a=1
function fn(){
var b=a+1;
console.log(b);
}
fn()
执行过程
:首先在创建fn函数时,会创建一个预先包含全局变量对象的作用域链,这个作用域链被保存在内部Scope属性中,当调用fn函数时,会为函数创建一个执行环境,然后通过复制内部的Scope属性中的对象构建起执行环境的作用域链,然后创建活动对象AO并推入执行环境的作用域链。在fn执行完成后,作用域被消毁。