JavaScript执行环境

执行环境也叫执行上下文(execution context) 是JavaScript中一个基础又很重要的概念。它是定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都会创建一个与之相关联的变量对象(存放执行环境定义的所有变量和函数,详细请跳转:JavaScript变量对象),建立一个作用域链,以及确定this的指向。

当控制器执行到可执行代码时,就会进入一个执行环境,执行环境分为三种:

  • 全局环境 JavaScript代码执行起来首先会进入全局环境
  • 局部环境(函数环境)当函数被调用时,就会进入当前函数环境执行代码,把当前环境推入栈内存中的顶端
  • eval

在一个JavaScript程序中会有多个执行环境被创建,JavaScript引擎利用堆栈来处理他们,这个堆栈叫做函数调用栈(call stack)。栈底永远都是全局环境,而栈的顶端则是当前执行环境。当前环境执行完毕后,会被弹出栈,接着进入下一个执行环境,直到进入全局环境,这时只有结束整个JavaScript程序也就是关闭当前网页或者关闭浏览器,全局环境才会被弹出被销毁。

示例代码

 

var num = 0;
function test(){
    function foo(){
    console.log("foo");
  }
  foo(); }
test();

首先进入全局环境,执行到可执行代码test()时,test()的执行环境被创建并且进入栈中。进到test环境后,代码继续执行遇到可执行代码foo()时,foo()的执行环境也被创建,foo()的执行环境进入栈。在foo()中,控制器没有遇到可以生成其他的执行环境了,于是顺利执行完毕,foo()执行环境被弹出栈。当前的环境就来到test(),test里的代码往下走也没有其他环境生产顺利执行完毕,弹出栈,就这样堆栈内存中就只剩全局环境了,只有当我们关闭网页或浏览器时,全局环境才出栈。(PS:函数中,遇到return能直接终止可执行代码的执行,因此会直接将当前上下文弹出栈。)

整个过程如下图:

从上面的分析我们可以总结执行环境有如下特点:

  • 单线程
  • 同步执行,只有栈顶的环境执行完毕出栈后,后面的环境才可以执行其代码。
  • 全局环境只有一个且永远在栈底,只有关闭网页或浏览器才会出栈。
  • 函数环境可以有无数个
  • 每次函数被调用都会创建其执行环境,即使调用自身,也会创建一个新的执行环境

 

执行环境的生命周期

在之前的变量对象随笔上也提到过执行环境的生命周期,分别是创建阶段和执行阶段

参考链接:http://mp.weixin.qq.com/s?__biz=MzI0NjU1NDE5Ng==&mid=2247484017&idx=1&sn=a53ddb77a8af6b18a83ef1c505fe2f80&chksm=e9bcc94adecb405c55390790b0e4c507e481d7701b4773c906cae14884022846d0e90fb03fb1&scene=0#rd

posted @ 2017-03-04 17:23  xplblog  阅读(268)  评论(0编辑  收藏  举报