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通过相同的name进行表格求和代码
Aug 18 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
JS简单实现元素复制示例附图
Nov 19 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
May 15 Javascript
jquery 取子节点及当前节点属性值
Jul 25 Javascript
js实现常用排序算法
Aug 09 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
关于不同页面之间实现参数传递的几种方式讨论
Feb 13 Javascript
微信小程序中post方法与get方法的封装
Sep 26 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 Javascript
Vue 中使用 typescript的方法详解
Feb 17 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实现的错误处理封装类实例
2017/06/20 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
script不刷新页面的联动前后代码
2013/09/18 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
Python读大数据txt
2016/03/28 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Python多进程编程常用方法解析
2020/03/26 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
初三家长会邀请函
2014/01/18 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
财产公证书格式
2014/04/10 职场文书
个人自荐书怎么写
2015/03/26 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
Android中View.post和Handler.post的关系
2022/06/05 Java/Android
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技