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 相关文章推荐
DWR Ext 加载数据
Mar 22 Javascript
js arguments.callee的应用代码
May 07 Javascript
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
Jquery阻止事件冒泡 event.stopPropagation
Dec 11 Javascript
js字符编码函数区别分析
Dec 28 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
three.js 入门案例详解
Jan 23 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
Mar 03 Javascript
使用JS实现动态时钟
Mar 12 Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 jQuery
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 setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python中的pack和unpack的使用
2018/03/12 Python
Flask之flask-session的具体使用
2018/07/26 Python
代码详解django中数据库设置
2019/01/28 Python
Django模型序列化返回自然主键值示例代码
2019/06/12 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
ECHT官方网站:男女健身服
2020/02/14 全球购物
Java面试题汇总
2015/12/06 面试题
办公室秘书岗位职责范本
2014/02/11 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
工作评语大全
2014/04/26 职场文书
移交协议书
2014/08/19 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python