深入理解javascript中执行环境(作用域)与作用域链
深入理解javascript中执行环境(作用域)与作用域链
相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享。
一般情况下,我们把执行环境分为全局执行环境和局部执行环境,其中局部执行环境我们又可以称之为函数执行环境。那么究竟什么使执行环境呢?通俗的说,执行环境即为代码执行时所处的环境。我们下来看一看如下代码,再进一步分析之。
<script>
var name="zhuzhenwei"; function changeName(){
if (name=="zhuzhenwei"){
name="heting";
}else{
name="zhuzhenwei";
}
}
changeName();
console.log(name); //heting
</script>
如上述代码,当执行第一个语句时,该语句所在的环境为全局执行环境,应当注意的是:每个执行环境都有一个与之相关联的变量对象,对于全局执行环境,与它向关联的对象为window对象。紧接着,下面这条语句声明了一个函数(注意:这里仅仅是声明了函数,没有被调用之前是不会执行内部代码的)。 同样这个函数也是处于全局执行环境的。最后,我们调用了changeName()函数,一旦调用了该函数,那么立即跳转到了changeName()函数的执行环境(即函数执行环境),一旦进入执行环境,便开始创建函数内部相应的变量(如函数中假设出现var a=12;这样的代码),不调用函数是不会创建的,且与之相关的变量对象我们认为是活动对象(活动对象开始只包含一个变量,即arguments对象),自此开始从上到下执行语句。与此同时,代码在函数环境中执行时,就会创建变量对象的一个作用域链,这个作用域链包含changeName()的变量对象和全局变量对象。
作用域链实际上就是我们可以通过它从前端到末端可以访问的范围,即保证对执行环境有权访问的所有变量和函数的有序访问,其中前端是指当前执行代码所在的变量对象,这里现在就是changeName()函数的变量对象,末端是全局变量对象,比如说:我们在执行函数时,需要寻找一个标识符,这是就是通过作用域链的末端进行寻找,若作用域链的末端找不到,就一直向上寻找,直到window对象。虽然在全局环境中我没有提到作用域链,但实际上全局环境中作用域链也是存在的,只是只有一个全局变量对象。 很明显:访问局部变量比访问全局变量更快,因为不用向上搜索作用域链。显然,作用域链是随着代码所处的执行环境的不同而动态变化的。
当执行完changeName()函数之后,即函数执行环境中的代码执行完成之后,该环境中的局部变量和局部对象会被立即销毁(如果变量没有用var声明,表明是全局变量,不会在局部环境的代码执行之后销毁),随即执行环境由函数执行环境转向全局执行环境,继续执行console.log(name);语句。只是,如果我们关闭网页或浏览器,全局环境也将被销毁。
总结如下:
- 执行环境也成为作用域,执行环境决定了变量的生命周期。
- 执行环境有全局执行环境和局部执行环境之分,每进入一个执行环境就会创建一个用于搜索变量和函数的作用域链,于是我们认为这个作用域链是动态变化的。
- 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含环境(父环境),乃至全局环境;而全局环境只能访问在全局环境中定义的变量和函数(局部环境中未使用var声明的变量也属于全局变量),不能访问局部环境中的数据(没有说所有数据,正是因为全局变量可以访问)。注意:函数中的参数时函数的局部变量。
世界上本没有路,你走过去了,那便是你的路。
深入理解javascript中执行环境(作用域)与作用域链的更多相关文章
- javascript中执行环境和作用域(js高程)
执行环境(execution context,为简单起见,有时也成为“环境”)是javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境 ...
- JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- 转载: JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- javascript 之执行环境-08
概念 执行环境(Execution context,简称EC)或执行上下文对象(后面统一用执行上下文表示),它定义了变量或者函数有权访问的其他数据,决定了他们各自的行为.是不是有点不好理解,那我先简单 ...
- 全面理解JavaScript中的 this
全面理解JavaScript中的 this 上下文 VS 作用域 作用域(scope) 是在运行时代码中的某些特定部分中变量,函数和对象的可访问性.换句话 说,作用域决定了代码区块中变量和其他资源的可 ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
- javascript中词法环境、领域、执行上下文以及作业详解
词法环境(Lexical Environments) 官方规范对词法环境的说明是:词法环境(Lexical Environments)是一种规范类型,用于根据ECMAScript代码的词法嵌套结构来定 ...
- 深入理解javascript中的立即执行函数
这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见,需要的朋友可以 ...
- 深入理解JavaScript中的作用域和上下文
介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...
随机推荐
- Dapper Vs Dbentry
公司项目数据库访问采用的dapper,以前没有用过.今天简单的测试下了,dapper和dbentry 查询效率情况. public ActionResult Test() { Sys_UserFaca ...
- name after, name for, name as
name after, name for, name as name after是一个常见用法 : 1.Her parents named her Sophia after her grandmo ...
- ubuntu-16.4TLS安装QQ
01下载Winqq 下载地址:http://www.ubuntukylin.com/application/show.php?lang=cn&id=27902解压zip unzip wine- ...
- 揭秘PHP匿名函数
揭秘PHP匿名函数 定义:匿名函数就是没有名字的函数. 有2种形式的匿名函数: 形式1:将一个匿名函数"赋值"给一个变量--此时该变量就代表该匿名函数了! 形式2: 是直接将一个匿 ...
- VS2015中GLAUX库的链接问题
最近学习OpenGL,照着例子写了个程序,用到了GLAUX库. #include <gl\glaux.h> #pragma comment(lib, "glaux") ...
- 莫比乌斯函数筛法 & 莫比乌斯反演
模板: int p[MAXN],pcnt=0,mu[MAXN]; bool notp[MAXN]; void shai(int n){ mu[1]=1; for(int i=2;i<=n;++i ...
- python之旅2
python基础 1整数 查看整数类型的方法 >>> a = 1 >>> dir(a) ['__abs__', '__add__', '__and__', '__c ...
- HTML5文件系统API和资料整理
来着火狐开发网络的官方文档:点我打开 : W3C的官方文档: 点我打开 : 园友的博客: 点我打开: 浏览器兼容性, 好了就chrome支持, 我刚刚更新的火狐37也不支持, nice, 太nice ...
- jQ1.5中的事件系统(低版本的事件系统)
jQ的一个个版本事系统都在修正着bug和不断优化, 而且看了事件系统对事件的兼容更加熟悉, 更加了解jQ内部的事件机制. 因为jQ对事件系统引入了事件命名空间,事件的代理, 事件的手动触发,事件描述等 ...
- SSD固态硬盘的闪存芯片颗粒介绍
固态硬盘凭借其存取速率超快等自身优势,被越来越多的电脑爱好者所青睐,并迅速普及到了广大用户的电脑中,因为固态硬盘与传统机械硬盘相比,确实在运行效率等方面有了质的提升,这里先了解一些评判固态硬盘优劣的知 ...