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 相关文章推荐
Prototype使用指南之hash.js
Jan 10 Javascript
Javascript 获取滚动条位置等信息的函数
Sep 08 Javascript
Js点击弹出下拉菜单效果实例
Aug 12 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
Jan 19 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
微信小程序 JS动态修改样式的实现代码
Feb 10 Javascript
详解vue项目的构建,打包,发布全过程
Nov 23 Javascript
js实现动态改变radio状态的方法
Feb 28 Javascript
用图片替换checkbox原始样式并实现同样的功能
Nov 15 Javascript
vue 实现v-for循环回来的数据动态绑定id
Nov 07 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数据的方法
2007/03/16 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
兼容浏览器的js事件绑定函数(详解)
2017/05/09 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
js实现无缝轮播图
2020/03/09 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
Unix/Linux开发面试题
2016/08/16 面试题
个人自我评价分享
2013/12/20 职场文书
给交警的表扬信
2014/01/12 职场文书
银行贷款收入证明
2014/10/17 职场文书
家长给老师的感谢信
2015/01/20 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android
SQL SERVER中的流程控制语句
2022/05/25 SQL Server