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 相关文章推荐
使用jscript实现二进制读写脚本代码
Jun 09 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
js判断undefined变量类型使用typeof
Jun 03 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
Dec 15 Javascript
Node.js如何自动审核团队的代码
Jul 20 Javascript
js中的关联数组与普通数组详解
Jul 27 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
jQuery实现用户输入自动完成功能
Feb 13 Javascript
vue-cli项目使用mock数据的方法(借助express)
Apr 15 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 Javascript
小程序分享链接onShareAppMessage的具体用法
May 22 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
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
《Python学习手册》学习总结
2018/01/17 Python
python文件选择对话框的操作方法
2019/06/27 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
简述数组与指针的区别
2014/01/02 面试题
Order by的几种用法
2013/06/16 面试题
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
电大会计学自我鉴定
2014/02/06 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
2015年世界无烟日活动方案
2015/05/04 职场文书
2016寒假假期总结
2015/10/10 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
python编程实现清理微信重复缓存文件
2021/11/01 Python