是js中最为重要的一个概念,它定义了变量或函数有权访问的其余数据,决定了它们各自的行为,每一个函数都有本身的执行环境.javascript
每一个执行环境都有与之关联的变量对象.它保存了这个环境中定义的全部变量和函数前端
当执行流进入一个函数,函数的环境就会被推入一个环境栈中,当执行环境中的全部代码执行完毕,栈将其环境弹出,把控制权返回给以前的执行环境.保存在该环境中的全部变量和函数定义也随之销毁java
当代码在一个环境中执行时,会建立变量对象的一个做用域链.它的用途是保证对执行环境有权访问的全部变量和函数有序访问.做用域的前端,始终是当前代码所在环境的变量对象.
若是这个环境是个函数,则将其活动对象做为变量对象.活动对象一开始只有一个变量,即arguments对象(是一个相似数组的对象, 对应于传递给函数的参数),它只存在于局部环境中
做用域链中的下一个变量对象来自包含当前环境的环境(能够理解为父函数),而下一个变量对象则来自下一个包含环境.这样一直延续到全局执行环境;全局执行环境的变量对象始终都是
做用域链的最后一个对象变量.标识符解析沿着做用域链一层一层往上查找,直到找到为止.数组
一个例子:函数
var color = "blue"; function changeColor(){ var anotherColor = "red"; function swapColor(){ var tempColor = "green"; //这里能访问tempColor,anotherColor和color } //这里能访问anotherColor和color } //这里只能访问color changeColor();
注意 : 函数的参数也被看成变量来对待,它就至关于在当前环境中申明的一个变量.ui
当执行流进入下列任何一个语句,做用域链就会被加长.try-catch语句的catch块
和with语句
url
一个例子:debug
function buildUrl() { var qs = "?debug=true"; with(location){ var url = href + qs; } return url; }
摘抄自 javascript高级程序设计(第三版) 4.2.1章.目前不是很理解.来日再改.设计
js不像其余类C语言,由花括号封闭的代码块有本身的做用域.code
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 也依然存在