JavaScript执行上下文栈与闭包机制解析

作者:青柠时间:2026-10-29 19:11:00浏览:276

本文详细解析JavaScript执行上下文栈的工作机制,通过压栈出栈过程展示函数调用的生命周期。重点探讨理想销毁场景下闭包对内存的影响,引出自由变量与作用域的概念,帮助开发者深入理解JS内存管理与作用域链。

在前文中,我们探讨了《谈谈我对JavaScript原型和闭包系列理解(随手笔记6)》。如需了解后续内容,可查阅《谈谈我对JavaScript原型和闭包系列理解(随手笔记9)》。

执行上下文栈

执行上下文栈

当执行全局代码时,会生成一个执行上下文环境。每次调用函数时,都会创建一个新的执行上下文环境。函数调用结束后,该上下文及其内部数据将被清除,程序控制权返回全局上下文。在任何时刻,只有一个执行上下文处于活动状态。

压栈出栈过程----执行上下文栈:

执行上下文栈


var a = 10,    //1. 进入全局上下文环境
  fn,
  bar = function(x) {
   var b = 5;
   fn(x + b); //3. 进入fn函数上下文
  };
fn = function(y) {
 var c = 5;
 console.log(y + c);
};
bar(10);    //2. 进入bar函数上下文环境 

1、在执行之前,首先创建全局上下文环境

 执行上下文栈

2、代码执行,执行到bar(10)之前,全局上下文中的变量在执行过程中被赋值。

 执行上下文栈

3、执行到bar(10)调用bar函数,同时创建该函数内部的执行上下文环境

 执行上下文栈

4、这时候该执行上下文环境进行压栈,设置为活动状态

 执行上下文栈

5、bar函数执行到fn(x + b),调用fn函数,创建了fn函数的执行上下文,并压栈,设置为活动状态

 执行上下文栈

6、fn函数执行完毕,fn环境出栈,被销毁,释放内存,bar函数变为活动态

 执行上下文栈

7、fn函数执行完毕并销毁,意味着bar也执行完毕了,此时bar函数环境出栈,并销毁。全局环境变为活动态。

 执行上下文栈

到这里这一段代码的执行过程就完毕了。

根据原作者的描述:

其中上下文环境的变量赋值过程我省略了许多,因为那些并不难,一看就知道。

的确!代码的大概执行过程跑完后,就能很清楚的知道各个执行环境中的变量是个怎样的状态。

闭包与自由变量

讲到这里,我不得不很遗憾的跟大家说:其实以上我们所演示的是一种比较理想的情况。有一种情况,而且是很常用的一种情况,无法做到这样干净利落的说销毁就销毁。这种情况就是伟大的——闭包。要说闭包,咱们还得先从自由变量和作用域说起。

以上内容是小编给大家分享我对JavaScript原型和闭包系列理解(随手笔记8),希望大家喜欢。

作者最新文章