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 相关文章推荐
html组件不可输入(只读)同时任何组件都有效
Apr 01 Javascript
深入了解javascript中的prototype与继承
Apr 14 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
jquery索引在使用中的一些困惑
Oct 24 Javascript
Jquery方式获取iframe页面中的 Dom元素
May 07 Javascript
js使用栈来实现10进制转8进制与取除数及余数
Jun 11 Javascript
jquery实现鼠标滑过小图时显示大图的方法
Jan 14 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
js 输入框 正则表达式(菜鸟必看教程)
Feb 19 Javascript
Vuejs+vue-router打包+Nginx配置的实例
Sep 20 Javascript
微信小程序实现的picker多级联动功能示例
May 23 Javascript
angular使用md5,CryptoJS des加密的方法
Jun 03 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入门之连接mysql数据库的一个类
2012/04/21 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php验证码生成器
2017/05/24 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP getName()函数讲解
2019/02/03 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
python 判断自定义对象类型
2009/03/21 Python
python求列表交集的方法汇总
2014/11/10 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
python装饰器深入学习
2018/04/06 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
基于jupyter代码无法在pycharm中运行的解决方法
2020/04/21 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
网站设计师的岗位职责
2013/11/21 职场文书
企业消防安全制度
2014/02/02 职场文书
海飞丝的广告词
2014/03/20 职场文书
财务会计专业求职信
2014/06/09 职场文书
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
图神经网络GNN算法
2022/05/11 Python
nginx七层负载均衡配置详解
2022/07/15 Servers
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python