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中 noConflict() 方法使用
Apr 25 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
May 14 Javascript
jquery+html5烂漫爱心表白动画代码分享
Aug 24 Javascript
JS阻止事件冒泡行为和闭包的方法
Jun 16 Javascript
深入理解vue-loader如何使用
Jun 06 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
Sep 06 Javascript
浅谈webpack性能榨汁机(打包速度优化)
Jan 09 Javascript
vue学习之Vue-Router用法实例分析
Jan 06 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
Aug 09 Javascript
JS检测浏览器开发者工具是否打开的方法详解
Oct 02 Javascript
微信小程序自定义底部弹出框动画
Nov 18 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
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
Python 元组(Tuple)操作详解
2014/03/11 Python
玩转python爬虫之cookie使用方法
2016/02/17 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Python输入二维数组方法
2018/04/13 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
经贸日语专业个人求职信范文
2013/12/28 职场文书
毕业生自荐书模版
2014/01/04 职场文书
学生实习介绍信
2014/01/15 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang