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 判断代码全收集
Apr 28 Javascript
jquery 将disabled的元素置为enabled的三种方法
Jul 25 Javascript
面向对象的Javascript之一(初识Javascript)
Jan 20 Javascript
JS判断是否长按某一键的方法
Mar 02 Javascript
创建一个类Person的简单实例
May 17 Javascript
AngularJs bootstrap详解及示例代码
Sep 01 Javascript
JS实现的简单轮播图运动效果示例
Dec 22 Javascript
JavaScript函数节流的两种写法
Apr 07 Javascript
iscroll动态加载数据完美解决方法
Jul 18 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
Jan 10 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
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 list()函数的详解
2013/06/05 PHP
探讨如何把session存入数据库
2013/06/07 PHP
二进制交叉权限微型php类分享
2014/02/07 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
常见的python正则用法实例讲解
2016/06/21 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python requests库用法实例详解
2018/08/14 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
怎么快速自学python
2020/06/22 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
顶岗实习协议书
2015/01/29 职场文书
奠基仪式致辞
2015/07/30 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫