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 相关文章推荐
基于jQuery架构javascript基础体系
Jan 01 Javascript
jquery mobile实现拨打电话功能的几种方法
Aug 05 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
纯js代码制作的网页时钟特效【附实例】
Mar 30 Javascript
jQuery获取父元素及父节点的方法小结
Apr 14 Javascript
jquery做个日期选择适用于手机端示例
Jan 10 Javascript
Angular实现响应式表单
Aug 04 Javascript
vue引入ueditor及node后台配置详解
Jan 03 Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
JS 数组随机洗牌的实例代码
Sep 12 Javascript
JS实现进度条动态加载特效
Mar 25 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中session退出登陆问题
2014/02/27 PHP
jQuery.get、jQuery.getJSON、jQuery.post无法返回JSON问题的解决方法
2011/07/28 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
JS 控件事件小结
2012/10/31 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
js获取ip和地区
2017/03/10 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python使用struct处理二进制的实例详解
2017/09/11 Python
python中模块的__all__属性详解
2017/10/26 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
python web框架 django wsgi原理解析
2019/08/20 Python
Python 使用多属性来进行排序
2019/09/01 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
python实现淘宝购物系统
2019/10/25 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
Python将字典转换为XML的方法
2020/08/01 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
什么时候用assert
2015/05/08 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
基层党支部整改方案
2014/10/25 职场文书
监察建议书
2015/02/04 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android