浅谈javascript中执行环境(作用域)与作用域链


Posted in Javascript onDecember 08, 2016

相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享。

一般情况下,我们把执行环境分为全局执行环境和局部执行环境,其中局部执行环境我们又可以称之为函数执行环境。那么究竟什么使执行环境呢?通俗的说,执行环境即为代码执行时所处的环境。我们下来看一看如下代码,再进一步分析之。

<script><br>var name="zhuzhenwei";
function changeName(){
    if (name=="zhuzhenwei"){
          name="heting";
    }else{
          name="zhuzhenwei";
    }
}
changeName();
console.log(name); //heting<br></script>

如上述代码,当执行第一个语句时,该语句所在的环境为全局执行环境,应当注意的是:每个执行环境都有一个与之相关联的变量对象,对于全局执行环境,与它向关联的对象为window对象。紧接着,下面这条语句声明了一个函数(注意:这里仅仅是声明了函数,没有被调用之前是不会执行内部代码的)。  同样这个函数也是处于全局执行环境的。最后,我们调用了changeName()函数,一旦调用了该函数,那么立即跳转到了changeName()函数的执行环境(即函数执行环境),一旦进入执行环境,便开始创建函数内部相应的变量(如函数中假设出现var a=12;这样的代码),不调用函数是不会创建的,且与之相关的变量对象我们认为是活动对象(活动对象开始只包含一个变量,即arguments对象),自此开始从上到下执行语句。与此同时,代码在函数环境中执行时,就会创建变量对象的一个作用域链,这个作用域链包含changeName()的变量对象和全局变量对象。

作用域链实际上就是我们可以通过它从前端到末端可以访问的范围,即保证对执行环境有权访问的所有变量和函数的有序访问,其中前端是指当前执行代码所在的变量对象,这里现在就是changeName()函数的变量对象,末端是全局变量对象,比如说:我们在执行函数时,需要寻找一个标识符,这是就是通过作用域链的末端进行寻找,若作用域链的末端找不到,就一直向上寻找,直到window对象。虽然在全局环境中我没有提到作用域链,但实际上全局环境中作用域链也是存在的,只是只有一个全局变量对象。 很明显:访问局部变量比访问全局变量更快,因为不用向上搜索作用域链。显然,作用域链是随着代码所处的执行环境的不同而动态变化的。           

当执行完changeName()函数之后,即函数执行环境中的代码执行完成之后,该环境中的局部变量和局部对象会被立即销毁(如果变量没有用var声明,表明是全局变量不会在局部环境的代码执行之后销毁),随即执行环境由函数执行环境转向全局执行环境,继续执行console.log(name);语句。只是,如果我们关闭网页或浏览器,全局环境也将被销毁。

总结如下:

  • 执行环境也成为作用域,执行环境决定了变量的生命周期。
  • 执行环境有全局执行环境和局部执行环境之分,每进入一个执行环境就会创建一个用于搜索变量和函数的作用域链,于是我们认为这个作用域链是动态变化的。
  • 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含环境(父环境),乃至全局环境;而全局环境只能访问在全局环境中定义的变量和函数(局部环境中未使用var声明的变量也属于全局变量),不能访问局部环境中的数据(没有说所有数据,正是因为全局变量可以访问)。注意:函数中的参数时函数的局部变量。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
使一个函数作为另外一个函数的参数来运行的javascript代码
Aug 13 Javascript
jQuery中add实现同时选择两个id对象
Oct 22 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
Mar 13 Javascript
详解JavaScript中基于原型prototype的继承特性
May 05 Javascript
jQuery的Read()方法代替原生JS详解
Nov 08 Javascript
JS实现倒计时(天数、时、分、秒)
Nov 16 Javascript
jQuery遮罩层实例讲解
May 11 jQuery
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
May 12 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
JS实现的小火箭发射动画效果示例
Dec 08 Javascript
详解vue中axios请求的封装
Apr 08 Javascript
express启用https使用小记
May 21 Javascript
原生js编写焦点图效果
Dec 08 #Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 #Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
Dec 08 #Javascript
Vue自定义指令介绍(2)
Dec 08 #Javascript
JS实现页面进入和返回定位到具体位置
Dec 08 #Javascript
解析利用javascript如何判断一个数为素数
Dec 08 #Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 #Javascript
You might like
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
JS实现简易日历效果
2021/01/25 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python中字符串的格式化方法小结
2016/05/03 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
python中os和sys模块的区别与常用方法总结
2017/11/14 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python write无法写入文件的解决方法
2019/01/23 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
PHP数据运算类型都有哪些
2013/11/05 面试题
大学生会计职业生涯规划范文
2014/02/28 职场文书
荆州古城导游词
2015/02/06 职场文书
《赵州桥》教学反思
2016/02/17 职场文书