JavaScript执行环境及作用域链实例分析


Posted in Javascript onAugust 01, 2018

本文实例讲述了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 相关文章推荐
js列举css中所有图标的实现代码
Jul 04 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 Javascript
js图片处理示例代码
May 12 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
Nov 24 Javascript
Node.js 条形码识别程序构建思路详解
Feb 14 Javascript
jQuery实现验证年龄简单思路
Feb 24 Javascript
jQuery对象的链式操作用法分析
May 10 Javascript
js判断复选框是否选中及选中个数的实现代码
May 30 Javascript
解决Extjs下拉框不显示的问题
Jun 21 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
JS函数式编程实现XDM一
Jun 16 Javascript
Vue.js 利用v-for中的index值实现隔行变色
Aug 01 #Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 #Javascript
看看“疫苗查询”小程序有温度的代码
Jul 31 #Javascript
Vue父子组件双向绑定传值的实现方法
Jul 31 #Javascript
react中实现搜索结果中关键词高亮显示
Jul 31 #Javascript
vue2.0页面前进刷新回退不刷新的实现方法
Jul 31 #Javascript
Node.js log4js日志管理详解
Jul 31 #Javascript
You might like
php adodb介绍
2009/03/19 PHP
php 变量定义方法
2009/06/14 PHP
PHP 缓存实现代码及详细注释
2010/05/16 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
微信小程序联网请求的轮播图
2017/07/07 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
python版学生管理系统
2018/01/10 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python同步windows和linux文件
2019/08/29 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
基于python使用tibco ems代码实例
2019/12/20 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
新闻学专业应届生求职信
2013/11/08 职场文书
教师自荐信
2013/12/10 职场文书
主办会计岗位职责
2014/03/13 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
公司财务管理制度
2015/08/04 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
详解MongoDB的条件查询和排序
2021/06/23 MongoDB