执行环境(execution context)是javascript中最为重要的一个概念。
其中,全局执行环境是最外围的一个执行环境。当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。全局执行环境的变量对象始终都是作用域链中的最后一个对象。
标识符解析是沿着作用域一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直至找到标识符为止。
var color="blue"; function changColor(){ if(color=="blue") { color="red"; } else { color="blue"; } } changColor(); alert("Color is now "+color); //red
每个环境都可以向上搜索作用域链,以查询变量和函数名,但是任何环境都不能通过向下搜索作用域链而进入另一个执行环境。
*延长作用域链 //p75
*没有块级作用域
if(true) { var color="blue"; } alert(color); //blue
如果在c、c++、或者java中,color会在if语句执行后销毁,但是在js中,if语句中的变量声明会将变量添加到当前的执行环境
for(var i = 0; i < 10; i++) { doSomething(i); } alert(i); //10
在js中,由for语句创建的变量i即使在for循环执行结束后,也依旧会存在于循环外部的执行环境中。
*查询标识符
搜索标识符,搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。如果在局部环境中找到该标识符,搜索过程停止,变量就绪。如果在局部环境中没有找到标识符,就继续沿作用域向上搜索。搜索过程将一直追溯到全局环境的变量对象。如果在全局环境中没有找到,那么该变量没有声明。
(1)var color="blue"; function getColor(){ return color; } alert(getColor()); //blue
(2)var color="blue"; function getColor(){ var color="red"; return color; } alert(getColor()); //red
其中在第二段代码中,任何位于局部变量color声明之后的代码,如果不使用window.color都无法访问全局color变量
新闻热点
疑难解答