本文详细解析JavaScript的执行环境(全局与函数)及作用域链机制。重点阐述如何通过try-catch的catch块和with语句临时延长作用域链,结合代码示例说明变量查找顺序与对象属性对变量赋值的影响,帮助开发者深入理解JS变量访问规则。
JavaScript执行环境详解
本文通过具体实例解析JavaScript的执行环境及作用域链机制,供读者参考学习。
1、执行环境:
每个执行环境都关联一个变量对象,该环境中定义的所有变量和函数均存储于此对象中。
执行环境主要分为全局执行环境和函数执行环境两类。
全局执行环境处于最外层,在浏览器环境中被视为window对象。所有全局变量和属性均作为window对象的属性和方法被创建。
函数执行环境指函数运行时的上下文。当执行流进入函数时,其环境会被压入环境栈;函数执行完毕后,栈弹出该环境,控制权交还至之前的执行环境。
作用域链机制解析
2、作用域链:
当代码在特定环境中执行时,会构建一个变量对象的作用域链。
作用域链的核心作用是确保有序访问执行环境中所有可访问的变量和函数。
作用域链的前端始终是当前执行代码所在环境的变量对象;若当前环境为函数,则其活动对象作为变量对象。活动对象初始仅包含arguments对象(全局环境中不存在此对象)。作用域链的下一个对象来自包含环境,依此类推,直至全局执行环境。全局执行环境的变量对象始终是作用域链的最后一个对象。
每个环境均可向上搜索作用域链以查询变量和函数名,搜索终点为全局执行环境。任何环境无法通过向下搜索进入另一个执行环境。内部环境可通过作用域链访问所有外部环境,但外部环境无法访问内部环境的任何变量和函数。
延长作用域链的方法
3、延长作用域链:
尽管执行环境仅分全局和函数两种,但可通过特定语句在作用域链前端临时增加一个变量对象,该对象在代码执行后会被移除。
当执行流进入以下语句时,作用域链会被延长:
(1)try-catch语句的catch块:catch语句会创建一个新的变量对象,其中包含被抛出的错误对象的声明。该变量对象仅在catch块内部有效,在catch块外部无法访问。
(2)with语句:with语句会将指定的对象添加到作用域链中。
eg1:
function setUrl(){
var parameter="?name=Alice";
var url = href + parameter;
return url;
}
var result = setUrl();
alert(result);//报错:href is no defined
eg2:
function setUrl(){
var parameter="?name=Alice";
with(location) {
var url = href + parameter;
}
return url;
}
var result = setUrl();
alert(result);//http://localhost/text.html?name=Alice
with语句接收的是location对象,因此其变量对象中包含了location对象的所有属性和方法,location对象被添加到了作用域链的前端。
eg3:
var obj = {href : "http://www.baidu.com"};
var href = "http://www.sina.cn";
function setUrl(){
var parameter="?name=Alice";
with(obj) {
href = "http://www.google.cn";
var url = href + parameter;
}
return url;
}
var result = setUrl();
alert(result);//http://www.google.cn?name=Alice
alert(href);//http://www.sina.cn
with语句中并没有更改变量href的值,而是更改了obj对象的 href 属性。
也就是说,with中首先查找的是相关对象的属性,如果没有,才改变变量的值。
eg4:
var obj = {};
var href = "http://www.sina.cn";
function setUrl(){
var parameter="?name=Alice";
with(obj) {
href = "http://www.google.cn";
var url = href + parameter;
}
return url;
}
var result = setUrl();
alert(result);//http://www.google.cn?name=Alice
alert(href);//http://www.google.cn
去掉obj对象的 href 属性后,才更改变量href的值。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript数据结构与算法技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。