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
前端全栈学习交流圈:866109386 面向1-3经验年前端开发人员 帮助突破技术瓶颈,提升思维能力
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的值。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
给萌新的Flexbox简易入门教程
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 【年末促销】葡萄城 2018 岁末福利火热放送中 原文出处:https://www.sitepoint.com/flexbox-css-flexible-box-layout/ 近几年,CSS领域出现了一些复杂的专用布局工具,用以代替原有的诸如使用表格、浮动和绝对定位之类的各种变通方案。Flexbox,或者说是弹性盒子布局模块(Flexible Box Layout Module)是这些新布局工具中的第一个,接着是CSS网格布局模块(CSS Grid Layout Module)。我们会在本文给出一个易于理解的flexbox入门介绍。 随着CSS网格布局的引入,你可能会问flexbox布局是否真的还有必要。虽然它们所能做的事情有一些重叠,但其各自在CSS布局中有着非常特别的目的。一般来说,flexbox在一维场景(比如,一串类似的元素)下有最佳应用,而网格是二维场景下理想的布局方案(例如整个页面的元素)。 即便如此,flexbox仍可以用于整个页面的布局,这样它能为那些还不支持网格布局的浏览器...
- 下一篇
全网第一篇SIP协议之GB28181注册(JAVA版本)
鉴于网上大部分关于SIP注册服务器编写都是C/C++/python,故开此贴,JAVA实现也贴出分享 GB28181定义了了 基于SIP架构的 视频监控互联规范,而对于多数私有协议实现的监控系统如果想接入SIP架构,就要借助网关,GB28181 规范了实现 SIP 监控域与非SIP 监控域互联。 以下是我在实际使用过程中总结的一些问题: 1. 当客户端第一次接入时,客户端将持续向Server端发送REGISTER消息,直到Server端回复"200 OK"后结束; 2. GB28181的注册流程牵扯用户认证,所以相对比较复杂,不过这也是安防通讯安全方面的一个亮点; 它的注册流程如下图: 用抓包工具看,如下图所示 注册流程: 1.客户端向服务器无限期发送Register消息: 这里客户端期初发送的Register消息为最简单的消息 2.当服务器接收到消息后,回送一个 401 消息“Unauthorized”,并在消息包头添加如下字段: 如下所示,这就是客户端接到401-Unauthorized之后再次发来的REGISTER消息,并且还附带了Auth字段,而第一次REGISTER消息是没有...
相关文章
文章评论
共有0条评论来说两句吧...