执行环境及作用域链
一 , 执行环境及作用域链
执行环境 :
是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 也依然存在