您的位置:首页 > Web前端 > JavaScript

JavaScript执行环境和作用域链

2017-05-04 22:06 190 查看
          首先,给大家介绍下JavaScript的执行环境,执行环境就是有权访问的变量与函数的集合,称之为变量对象,首先,js 中全局执行环境是最外层的一个执行环境,在浏览器中,全局执行环境就是window对象,另外每个函数也有自己的执行环境,当执行环境中的代码执行完毕后,该执行环境被销毁,保存在其中所有的变量和函数定义也随之销毁(而全局作用域直到关闭网页或浏览器时才被销毁)

         js里面没有块级执行环境(es6里面有),但是有函数执行环境,当执行流进入一个函数时,函数的环境会被推入一个环境栈中(如果你理解栈,你可以深入了解为什么有作用域链)而在函数执行后,栈将其弹出,把控制权返回给之前的执行环境,所以执行流实际就是栈机制。

       那么什么是作用域链呢?当函数执行时,会创建一个作用域链,作用域的作用就是保证执行环境对有权访问的变量与函数的有序访问。作用域的前端始终是一个活动对象(包含了函数的arguments,局部变量等)而作用域链的下一个变量对象则是下一个包含环境,这样一直延续到全局环境,全局环境始终是作用域链的最后一个对象。

      而标识符解析就是沿着作用域链一级一级地搜索标识符的过程,从作用域的最前端逐级向后回溯,直到找到一个就停止搜索,如果找不到就报错

     看下面一个例子具体说明

      var a = 5;
function fun1(){
var a = 3;
var b = 4;
function fun2(){
var c = a;
b = c;
console.log(c); //3
}
fun2();
console.log(b); //3
}
fun1();    上面的例子有3个执行环境,一个全局执行环境,和fun1()局部执行环境和fun2()局部执行环境,全局执行环境里面有a变量和fun1函数,fun1()执行环境里面也有一个a变       量,b变量和fun2函数,fun2()执行环境里面有c变量,那么下面的图是作用域链图示。矩形表示执行环境内部函数可以通过作用域链访问外层环境中的变量,但是反之不行
     

      那么解析标识符,就会沿着函数的作用域链从最前端向后搜索,直到搜索到同名的标识符就停止搜索,比如在fun2环境里访问a变量,但是在fun2的自身的活动对象里面并没有,所以会在上一级fun1的环境里面搜索,发现找到了a,则停止搜索,所以这就是为什么在fun2执行环境里面访问的a值不会是全局环境里面的那个a值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息