0

0

什么是Javascript的执行上下文与作用域链?

夜晨

夜晨

发布时间:2026-01-08 16:47:33

|

700人浏览过

|

来源于php中文网

原创

javascript执行上下文分全局、函数、eval三种,分别在页面加载、函数调用、eval执行时创建;作用域链在函数定义时静态确定,沿词法环境逐级向上查找变量,未命中则抛referenceerror。

什么是javascript的执行上下文与作用域链?

JavaScript 的执行上下文(Execution Context)和作用域链(Scope Chain)不是两个独立概念,而是运行时机制的一体两面:执行上下文定义了代码执行的“环境容器”,作用域链则是该容器内查找变量时实际走的那条路径。

执行上下文分哪几种?各自何时创建

JS 引擎每次执行一段可执行代码(global code、function code、eval code)前,都会先创建一个执行上下文。它分为三类:

  • Global Execution Context:页面加载时自动创建,对应 window浏览器)或 globalThis(Node.js),this 指向全局对象
  • Function Execution Context:每次调用函数时创建,包含自己的 argumentsthis 和词法环境(LexicalEnvironment)
  • Eval Execution Context:极少用,且严格模式下禁用,不建议关注

注意:setTimeout 回调、事件处理函数、Promise 回调等异步代码,执行时也各自进入新的函数执行上下文,不是“延续”上一个上下文。

作用域链怎么形成的?为什么找不到变量会报 ReferenceError

作用域链是执行上下文内部的一个只读属性([[Scopes]]),由当前函数的词法环境向上逐级链接到外层词法环境,最终到全局环境。它在函数定义时就确定(静态),而非调用时决定。

立即学习Java免费学习笔记(深入)”;

Fish Audio
Fish Audio

为所有人准备的音频 AI

下载

变量查找过程就是沿着这条链逐级搜索:

  • 先查当前执行上下文的 LexicalEnvironment(含 let/const 声明)
  • 再查 VariableEnvironment(含 var 声明)
  • 没找到就跳到外层函数的 LexicalEnvironment,直到全局
  • 全程未命中 → 抛出 ReferenceError(不是 undefined
function outer() {
  const x = 10;
  function inner() {
    console.log(x); // 沿作用域链找到 outer 的 LexicalEnvironment 中的 x
  }
  inner();
}
outer();

varlet/const 在作用域链中表现不同?

不是作用域链本身不同,而是它们绑定的位置不同:

  • var 声明被提升并绑定到当前执行上下文的 VariableEnvironment,所以能在声明前访问(值为 undefined
  • let/const 绑定到 LexicalEnvironment,但存在“暂时性死区”(TDZ):从块顶部到声明语句之间,访问会直接抛 ReferenceError
  • 两者都遵循同一条作用域链;区别只在于“是否允许在声明前读取”以及“绑定发生的环境对象”
console.log(a); // undefined(var 提升)
console.log(b); // ReferenceError(TDZ)
var a = 1;
let b = 2;

闭包是怎么靠作用域链存活的?

闭包本质是函数对象持有了对其定义时所在词法环境的引用。即使外层函数执行结束、其执行上下文本该被销毁,只要内层函数还存在(比如被返回、被赋值给全局变量),JS 引擎就会保留该外层环境——因为作用域链仍需要它。

容易忽略的关键点:

  • 不是所有嵌套函数都是闭包,只有当内部函数在定义它的作用域外部被调用时,才构成闭包
  • 闭包捕获的是“变量的绑定”,不是值快照;多个闭包共享同一外层变量(如循环中没用 let 声明 i,所有回调共享同一个 i
  • 滥用闭包可能引发内存泄漏,尤其在 DOM 事件监听或定时器中长期持有大对象

真正难理解的,从来不是“链怎么连”,而是“哪些环境被保留、哪些被释放”——这取决于引擎的垃圾回收策略与你是否无意中维持了对词法环境的强引用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

557

2023.09.20

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

87

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

104

2025.09.18

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

151

2025.07.29

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

514

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

698

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5946

2023.08.17

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号