0

0

JavaScript中什么是作用域链_变量查找规则你清楚吗

夜晨

夜晨

发布时间:2026-01-02 19:58:02

|

889人浏览过

|

来源于php中文网

原创

作用域链是函数定义时确定的静态嵌套引用链,基于[[Scope]]逐层向上查找变量,只取决于定义位置而非调用位置;未声明变量读取返回undefined,严格模式下写入才抛ReferenceError。

javascript中什么是作用域链_变量查找规则你清楚吗

作用域链的本质是词法作用域的嵌套引用链

JavaScript 的作用域链不是运行时动态构建的“搜索路径”,而是函数定义时就确定的、由 [[Scope]](或现代引擎中的闭包环境记录)维护的一组静态嵌套关系。每次函数执行,引擎会基于这个链逐层向上查找变量,直到全局作用域。

关键点在于:查找只看「函数在哪定义」,不看「函数在哪调用」。比如一个内层函数被返回并赋值给全局变量后调用,它依然沿原定义位置的作用域链查找,而非调用位置的作用域。

变量查找失败时不会报错,而是返回 undefined

只有在严格模式下对未声明变量进行赋值(如 foo = 42)才会抛出 ReferenceError;而单纯读取未声明变量(如 console.log(missing))始终返回 undefined,哪怕查到全局作用域也没找到。

  • 常见误判:以为 ReferenceError 表示“变量不存在”,其实它只发生在「写入未声明变量」或「访问 let/const 声明前的暂时性死区」
  • var 声明会被提升,但初始化不会;let/const 声明和初始化都被绑定到暂时性死区
  • 全局对象上的属性(如 window.x)和真正用 var 声明的全局变量行为不完全等价——后者不可删除,前者可删

witheval 会动态污染作用域链

这两个语句会让 JavaScript 引擎无法在编译期静态确定变量归属,从而禁用大部分优化(如变量内联、作用域链缓存),并强制进入慢路径查找。现代代码应避免使用。

天工大模型
天工大模型

中国首个对标ChatGPT的双千亿级大语言模型

下载

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

例如:

function f() {
  const obj = { x: 1 };
  with (obj) {
    console.log(x); // 运行时才知道 x 来自 obj,作用域链临时插入 obj 环境
  }
}
  • with 在严格模式下直接语法错误
  • eval 如果含变量声明,会在当前作用域注入新绑定,破坏静态分析
  • 打包工具(如 Webpack)遇到 eval 通常会关闭作用域提升优化

闭包让外层作用域“活下来”,但不等于“捕获全部变量”

闭包保留的是对外层词法环境的引用,但只保留实际被内部函数引用的那些变量(V8 称为“context slot”)。没被引用的变量仍可能被 GC 回收。

比如:

function makeCounter() {
  let count = 0;
  const unused = new Array(1000000); // 很大但没被返回的函数使用
  return () => ++count;
}
const inc = makeCounter(); // unused 不会常驻内存
  • 不要默认认为“用了闭包=内存泄漏”,现代引擎做了精细的上下文剪枝
  • 调试时看到 DevTools 中显示整个外层作用域,只是快照视图,不代表所有变量都真实保留在内存中
  • console.dir(fn) 查看 [[Scopes]] 可以确认哪些变量被真正闭包持有
真正容易被忽略的是:作用域链的“终点”不是 windowglobalThis,而是当前执行上下文的 LexicalEnvironment 链末端——它可能是模块顶级作用域、函数作用域,也可能是 eval 创建的特殊环境。查不到变量时,引擎不会跳去其他模块或 script 标签里找。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的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关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

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

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

95

2025.09.18

python 全局变量
python 全局变量

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

106

2025.09.18

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

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

152

2025.07.29

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

420

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

541

2024.05.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6472

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3338

2024.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

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

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

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

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