执行环境及作用域链

一 , 执行环境及作用域链

执行环境 :

是js中最为重要的一个概念,它定义了变量或函数有权访问的其他数据,决定了它们各自的行为,每个函数都有自己的执行环境.

变量对象:

每个执行环境都有与之关联的变量对象.它保存了这个环境中定义的所有变量和函数

执行流 :

当执行流进入一个函数,函数的环境就会被推入一个环境栈中,当执行环境中的所有代码执行完毕,栈将其环境弹出,把控制权返回给之前的执行环境.保存在该环境中的所有变量和函数定义也随之销毁

作用域链 :

当代码在一个环境中执行时,会创建变量对象的一个作用域链.它的用途是保证对执行环境有权访问的所有变量和函数有序访问.作用域的前端,始终是当前代码所在环境的变量对象.
如果这个环境是个函数,则将其活动对象作为变量对象.活动对象一开始只有一个变量,即arguments对象(是一个类似数组的对象, 对应于传递给函数的参数),它只存在于局部环境中
作用域链中的下一个变量对象来自包含当前环境的环境(可以理解为父函数),而下一个变量对象则来自下一个包含环境.这样一直延续到全局执行环境;全局执行环境的变量对象始终都是
作用域链的最后一个对象变量.标识符解析沿着作用域链一层一层往上查找,直到找到为止.

一个例子:

var color = "blue";
function changeColor(){
	var anotherColor = "red";
    
    function swapColor(){
    	var tempColor = "green";
        //这里能访问tempColor,anotherColor和color
    }
    //这里能访问anotherColor和color
}
//这里只能访问color
changeColor();

***注意 : ***函数的参数也被当作变量来对待,它就相当于在当前环境中申明的一个变量.

二 , 延长作用域链

当执行流进入下列任何一个语句,作用域链就会被加长.try-catch语句的catch块with语句

一个例子:

function buildUrl() {
    var qs = "?debug=true";
    with(location){
        var url = href + qs;
}
return url;
}

摘抄自 javascript高级程序设计(第三版) 4.2.1章.目前不是很理解.来日再改.

三 , 没有块作用域

js不像其他类C语言,由花括号封闭的代码块有自己的作用域.

if (true) {
        var color = "blue";
    }
alert(color); //"blue"

这里是在一个if语句中定义了变量color.如果是类C语言中,color会在if执行完后被销毁,而js则是把这个变量添加到当前的执行环境里(这里就是全局环境).
在使用for语句时这一点就很重要.

for (var i=0; i < 10; i++){
        doSomething(i);
}
alert(i);      //10
//i已经跑到了执行环境中了,for循环结束了,i 也依然存在
posted @ 2017-09-25 16:14  puss_in_art  阅读(129)  评论(0编辑  收藏  举报