标签:
执行环境(execution context):定义了变量或函数有权访问的其他数据。
注:每个执行环境都有一个与之关联的变量对象(VO),环境中定义的所有变量和函数都保存在这个对象中,供解析器在处理数据时使用。
执行环境的种类:全局执行环境和函数的局部执行环境
相对应的与之关联的变量对象:全局执行环境的变量对象和函数执行环境的变量对象
作用域链的生成:
当代码在一个执行环境中执行时,会创建变量对象(VO)的一个作用域链,保证对执行环境有权访问的所有变量和函数的有序
访问。作用域链的前端始终是当前执行的代码所在执行环境的变量对象,下一个变量对象来自下一个包含执行环境,一直延续到
全局执行环境(window)的变量对象。
1 var color = "green";
2
3 var val = (function a(){
4 var color = "red"
5 return function b(){
6 alert(color);
7 }
8 })();
9
10 val();//"red"
11 alert(color);//"green"
对于function a而言,它的作用域链上面有自身执行环境的变量对象、全局变量对象
对于function b而言,它的作用域链上面有自身执行环境的变量对象、执行环境function a的变量对象、全局变量对象
变量是根据作用域链上的变量对象从里层的执行环境到外层的执行环境进行一层层寻找的:
val()执行时即执行内部的返回函数,line 6的color会先从自身的变量对象开始找,没有找到,再到外层的执行环境(即a函数)的变量对象开始找,找到color=“red”,返回,将控制权返回给之前的执行环境。alert(color),该color所在的执行环境是全局执行环境,所以只能在全局变量对象中找,找到color=“green”。
《JavaScript高级程序设计》
标签:
原文地址:http://www.cnblogs.com/ZHeGeS/p/4658650.html