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 select的操作实现代码
May 06 Javascript
node.js中的console用法总结
Dec 15 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
Feb 14 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 Javascript
利用HBuilder打包前端开发webapp为apk的方法
Nov 13 Javascript
React组件对子组件children进行加强的方法
Jun 23 Javascript
微信小程序点击view动态添加样式过程解析
Jan 21 Javascript
js实现有趣的倒计时效果
Jan 19 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
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
python版百度语音识别功能
2019/07/09 Python
使用Python函数进行模块化的实现
2019/11/15 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
购房意向书范本
2014/04/01 职场文书
借款协议书范本
2014/04/22 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
迁户口计划生育证明
2014/10/19 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书