执行上下文是JavaScript代码运行时的环境,分为全局、函数和eval三种类型,每调用一个函数就会创建一个新的执行上下文并压入执行栈。其生命周期包含创建和执行两个阶段:创建阶段确定this、生成词法环境与变量环境;执行阶段进行变量赋值和代码执行。作用域链由词法环境构成,用于按定义位置从内向外查找变量,确保函数能访问外层作用域的变量,形成闭包机制。闭包使内部函数可持久访问外部函数的变量,即使外部函数已执行完毕,如counter示例中count被持续引用而未被销毁。理解执行上下文与作用域链有助于掌握变量查找机制和函数执行原理,提升代码逻辑清晰度与质量。

在 JavaScript 中,理解执行上下文和作用域链是掌握变量查找机制和函数执行原理的关键。每当 JavaScript 代码运行时,引擎会创建一个执行环境,这个环境就是“执行上下文”。而作用域链则是该上下文中用于查找变量的路径机制。
执行上下文是什么
执行上下文是 JavaScript 引擎用来管理代码执行的一种内部机制。它并不是代码本身,而是代码运行时所处的环境。每一段可执行代码(全局代码、函数代码、eval 代码)都会对应一个执行上下文。
执行上下文分为三种类型:
全局执行上下文:代码首次运行时创建,只有一个。全局对象(浏览器中是 window)在此上下文中创建,this 指向全局对象。 函数执行上下文:每次调用函数时都会创建一个新的执行上下文,函数之间相互独立。 eval 执行上下文:在 eval 函数中运行的代码会生成自己的执行上下文,通常不推荐使用。
JavaScript 是单线程语言,同一时间只能执行一个上下文,其他上下文会被放入执行栈(也叫调用栈)中排队。当前执行完毕后,控制权交还给上一层。
立即学习“Java免费学习笔记(深入)”;
执行上下文的生命周期
每个执行上下文的创建和执行分为两个阶段:
1. 创建阶段确定 this 的值(this binding) 创建词法环境(Lexical Environment),用于处理变量声明(let/const)和函数声明 创建变量环境(Variable Environment),主要用于 var 声明
在这个阶段,变量和函数已经被注册,但尚未赋值(var 变量为 undefined,let/const 处于暂时性死区)。
2. 执行阶段逐行执行代码 变量被赋值,函数被调用 词法环境中的变量完成初始化
例如:
var a = 10;function foo() { var b = 20; console.log(a); // 10}foo();
当 foo 被调用时,会创建新的函数执行上下文,进入创建阶段:this 绑定、变量环境记录 b,然后进入执行阶段赋值并输出 a。
作用域链与变量查找机制
作用域链是执行上下文的一部分,它是由一系列词法环境组成的链式结构,用于变量查找。它的核心原则是:从内向外逐层查找变量,直到全局上下文为止。
作用域链的形成基于函数定义时的位置,而不是调用位置(这就是词法作用域)。
举个例子:
var x = 'global';function outer() { var y = 'outer'; function inner() { var z = 'inner'; console.log(x, y, z); // "global" "outer" "inner" } inner();}outer();
当 inner 函数执行时,其作用域链包含三个环境:
inner 自己的词法环境(有 z) outer 的词法环境(有 y) 全局词法环境(有 x)
变量查找按此顺序进行。如果某变量在当前环境找不到,就向上一级查找,直到全局环境。若仍未找到,则抛出 ReferenceError。
闭包与作用域链的关系
闭包是指函数能够访问其定义时所在作用域的变量,即使外部函数已经执行完毕。这正是作用域链的体现。
看下面的例子:
function outer() { var count = 0; return function inner() { count++; console.log(count); };}var counter = outer();counter(); // 1counter(); // 2
虽然 outer 已经执行结束,其执行上下文本应销毁,但由于 inner 函数引用了 outer 中的 count 变量,所以 outer 的词法环境仍然保留在内存中。inner 的作用域链保留了对 outer 环境的引用,从而实现了状态持久化。
基本上就这些。执行上下文决定了代码如何运行,作用域链决定了变量如何查找。理解它们有助于写出更清晰、不易出错的 JavaScript 代码,尤其是在处理嵌套函数和异步逻辑时。不复杂但容易忽略。
以上就是执行上下文详解_javascript作用域链的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539327.html
微信扫一扫
支付宝扫一扫