文档章节

JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制

前端二牛
 前端二牛
发布于 2018/12/01 15:55
字数 1103
阅读 17
收藏 0

执行环境是JavaScript中最为重要的一个概念,每个执行环境都有一个与之关联的变量对象,执行环境中所有的变量和函数都保存在这个对象中。我们编写的代码是无法访问这个变量对象的,只有解析器在处理数据时会在后台使用它,但有个例外,因为在Web浏览器中,全局执行环境关联的变量对象是window对象,window对象是代码可访问的,所以代码是可以访问全局执行环境的变量对象的。

当某个执行环境中所有的代码执行完毕后,该环境就会被销毁,保存在其中的所有的变量和函数也会随之销毁,全局执行环境直到应用程序退出,例如关闭网页或浏览器时才会被销毁。

每个函数都有自己的执行环境,可以称之为局部执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。ECMAScript程序中的执行流正是由这个方便的机制控制着。

使用Chrome可以很方便地看到函数的执行环境栈进出情况,以下面代码为例:

var mName = 'Rose';
function father(){
    var fName = 'Jack';
    function son() {
        var sName = 'Tom';
        function sayWord(){
            var word = 'my name: ' + sName + ', father name: ' + fName + ', mother name: ' + mName;
            console.log(word);
        }
        sayWord();
    }
    son();
}
father();

father内部声明了一个函数sonson的内部声明了一个函数sayWord,如下图,代码执行到第9行时,father函数的执行环境进栈,

随着代码依次向后执行,如下图,sonsayWord也依次进栈。

函数执行完毕后又依次从栈顶出栈,控制权返回给之前的执行环境。

上图中,我们看到在环境栈的下方有个Scope区域,Scope指的就是作用域,Global是全局作用域,每个函数执行环境进栈时,Local指的就是当前执行环境的作用域。函数执行时会生成一个活动对象,这个活动对象就是变量对象,函数中声明的变量就保存在这个对象中,如上图中的fNamesNameword。作用域会形成作用域链,作用域链的前端是当前执行函数的作用域,末端则是全局作用域,作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问,解析器在解析变量或函数时,会沿着作用域链从前端逐级地向后搜索,直至找到为止,如果始终找不到,通常会报错。

可以用下面这个示意图来理解执行环境、作用域和变量对象之间的关系。

执行环境可理解为一个抽象概念,里面包含了程序执行的所有元素,作用域可视为变量和函数生效的区域,每个执行环境里又有一个变量对象用于存放声明的变量和函数。

如果读者对原型比较熟悉的话,可以阅读本段,否则忽略即可。无论是在全局作用域还是局部作用域,我们定义的变量和函数都是作为作用域变量对象的属性存在的,解析器解析时是顺着作用域链逐级搜索的。而当我们访问某个对象的属性时,这个属性要么是定义在对象上,要么是定义在原型上或者原型链的某一级上,解析器解析时是顺着原型链逐级搜索的。这一点,我们可以比较着来学习。

本文参考《JavaScript高级程序设计(第3版)》

© 著作权归作者所有

共有 人打赏支持
前端二牛
粉丝 23
博文 86
码字总数 47062
作品 0
浦东
高级程序员
私信 提问
深入理解JavaScript执行上下文和执行栈

前言 如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制。执行上下文和执行栈是JavaScript中关键概念之一,是JavaScrip...

浪里行舟
03/18
0
0
深入理解 JavaScript 执行上下文和执行栈

作者:浪里行舟 Fundebug经授权转载,版权归原作者所有。 前言 如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制。执行...

Fundebug
03/20
0
0
javascript之变量,作用域和内存问题

基本类型和引用类型 javascript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。而引用...

柳哥
2015/04/06
0
0
Javascript并发模型和事件循环

JavaScript的"并发模型"是基于事件循环的.这个并发模型有别与Java的多线程,javascript的并发是单线程的. 我简单的画了一个 javascript 的执行图,我们通过图,逐步分析. 栈 函数调用时所用的执...

modernizr
2014/06/23
350
1
JavaScript执行环境及作用域(三)——没有块级作用域

JavaScript中没有块级作用域经常会导致理解上的困惑,在其他类C的语言中,由花括号封闭的代码都有自己的作用域,因而支持根据条件来定义变量。但是在JavaScript中下面的代码并不会得到想象中...

Bob2100
2018/12/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用 C 语言编写 Windows 服务程序的五个步骤(转)

摘要   Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并 实现一个简单的服务程...

_编程菜鸟_
21分钟前
0
0
Linux各目录及每个目录的详细介绍

目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/...

若杰
23分钟前
4
0
vue组件系列5、日期选择

插件部分源码 <template> <div class="date-picker" @click.stop> <input class="input" v-model="dateValue" v-on:mouseover="openPanel" /> <!-- 动画特效 --> <transi......

轻轻的往前走
24分钟前
1
0
SQL

BEGIN #定义一个变量来保存该记录是否存在 declare num int; #这条sql,就是查询对应的记录有多少条,注意 into num 这两句话,就是把count(*) 查出的值,赋给到num中 select co...

张泽立
25分钟前
1
0
云栖科技评论87期:建立AI规则非常重要 但充分对话更重要

【卷首语】建立AI规则非常重要 但充分对话更重要    2016年,谷歌CEO Sundar Pichai宣布谷歌战略从Mobile First(移动优先)转向AI First(人工智能优先),在此之后,谷歌不仅在AI领域持续投入...

Mr_zebra
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部