执行环境是JavaScript中一个非常重要的概念,它定义了变量或者函数有权访问的其他数据,决定了各自的行为,每个执行环境都有与其相对应的变量对象,该环境中所有的变量和函数都保存在这个对象中.
分类
- 全局执行环境:是最外围的环境,由ECMAScript实现所在的宿主环境决定,比如在Web浏览器中,全局环境被认为是window对象.
- 函数执行环境:每个函数都有自己的执行环境,当执行流进入一个函数后,函数的环境就被推入环境栈,执行完毕后再弹出.
作用域链
当代码在一个执行环境中执行时创建变量对象的作用域链,保证有序访问,作用域链的最前端始终都是当前代码所在环境的变量对象,作用域链中的下一个变量对象来自外部环境 ,再下一个变量对象来自下一个外部环境,全局执行环境的变量对象始终都是作用域链中的最后一个对象.
- 内部环境可以通过作用域链访问外部环境,但反过来不行.
- 函数参数也被当做变量对待,访问规则与执行环境中其他变量相同.
查询标识符
当在某个环境中引用一个标识符时,必须通过搜索来确定该标识符代表什么,搜索从作用域链的最前端开始,逐级往上查找.如果一直到全局环境中也没有找到该标识符,则意味着该变量未声明.