javascript作用域如何理解_全局和局部作用域有何不同【教程】
技术百科
幻影之瞳
发布时间:2026-01-28
浏览: 次 作用域决定变量和函数在代码中哪些地方能被访问,核心是“定义之后谁找得到它”;JavaScript 通过词法分析预建作用域链,与运行时调用和 this 无关;var 具有函数作用域和变量提升(声明提升、赋值不提升),无块级作用域;let/const 具有块级作用域和暂时性死区(TDZ);ESM 模块作用域完全隔离,顶层声明不挂载全局,未 export 不可访问。
什么是作用域,它到底管什么
作用域决定变量和函数在代码中哪些地方能被访问。不是“能不能定义”,而是“定义之后谁找得到它”。JavaScript 在执行前就通过词法分析确定了作用域链,跟运行时调用无关——这点和 Python 的 LEGB 不同,也和 this 完全无关。
关键判断:变量声明的位置(var、let、const 所在的块或函数)直接决定了它的作用域边界,而不是它在哪被调用。
var 声明的变量为什么会有变量提升和函数作用域
var 声明会被提升到其所在函数(或全局)顶部,但赋值不提升;而且它没有块级作用域,if 或 for 里的 var 仍属于外层函数或全局。
-
var a = 1;在if (false) { var a = 2; }之后访问,a仍是1(不是 ReferenceError),因为声明已提升,赋值被跳过 - 在函数内用
var声明,外部无法访问;但在{ va这样的块里声明,
r b = 3; }
b依然可在块外访问 - 全局
var会成为window(浏览器)或globalThis的可删除属性;而let/const不会
let 和 const 的块级作用域怎么影响实际编码
let 和 const 绑定在最近的块({})、函数、模块顶层,且存在暂时性死区(TDZ):从块开始到声明语句前,访问会抛出 ReferenceError,不是 undefined。
立即学习“Java免费学习笔记(深入)”;
-
for (let i = 0; i console.log(i), 0);输出0、1、2;换成var i就输出三个3 -
if (true) { const x = 1; } console.log(x);直接报错:ReferenceError: x is not defined -
const obj = {}; obj.prop = 1;合法;但obj = {};报错——const约束的是绑定,不是值的可变性
全局作用域和模块作用域在现代 JS 中的实际区别
ESM(import/export)下,每个文件默认是独立模块作用域;顶层 let/const/class 不挂载到 window,也不污染全局。而传统 script 标签中的顶层声明(无论 var 还是 let)都属于全局作用域。
- 两个 ESM 文件都声明
const API_URL = 'https://a.com';,互不影响;但两个都写这句,第二个会报错(重复声明) -
var在模块顶层仍会提升,但不会变成window属性;let/const在模块顶层就是纯粹的模块私有绑定 - Node.js 中
require()加载的 CommonJS 模块,其顶层this指向module.exports,不是 global,这也是作用域隔离的一种体现
真正容易被忽略的是:模块作用域不是“更高级的全局作用域”,它是完全隔离的——没有显式 export,外面就真的看不见,连 eval 都绕不过去。
# python
# 浏览器
# win
# js
# javascript
# java
# if
# class
# 编码
# 区别
# require
# 为什么
# var
# node
# 作用域
# for
# node.js
# const
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Python随机数生成_random模块说明【指导
- 如何在 Go 中正确反序列化 XML 多节点数组(
- 如何用列表一次性对 DataFrame 的指定列应
- Win11怎么关闭任务栏小组件_Windows11
- PythonWeb前后端整合项目教程_FastAP
- Django密码修改后会话失效的解决方案
- php错误怎么开启_display_errors与
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Windows10系统怎么查看显卡型号_Win10
- php中::能访问全局变量吗_全局作用域与类作用域
- Win10 BitLocker加密教程 Win10
- 如何解决同一段404代码在不同主机上表现不一致的问
- Python大型项目拆分策略_模块化解析【教程】
- 如何使用Golang配置安全开发环境_防止敏感信息
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- 静态属性修改会影响所有实例吗_php作用域操作符下
- Win11如何设置自动关机 Win11定时关机命令
- Windows10系统怎么查看设备管理器_Win1
- php本地部署支持nodejs吗_php与node
- Win11怎么设置默认浏览器Chrome_Wind
- Windows 10怎么隐藏特定更新补丁_Wind
- Win11怎么开启HDR模式_Windows 11
- 如何在Mac上搭建Golang开发环境_使用Hom
- 如何在 Go 中可靠地测试含 time.Time
- php怎么下载安装后无法解析php文件_服务器配置
- windows系统找不到无线网络怎么办_windo
- Python安全爬虫设计_IP代理池与验证码识别策
- php485在php5.6下能用吗_php485旧
- Win11怎么退出微软账户_切换Win11为本地账
- Windows10电脑怎么查看硬盘通电时间_Win
- php485读数据时阻塞怎么办_php485非阻塞
- 怎么将XML数据可视化 D3.js加载XML
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- Win11怎么打开注册表_Windows 11注册
- Win11怎么更改默认打开方式_Win11关联文件
- 如何优化Golang内存分配与GC调度_Golan
- Python文件管理规范_工程实践说明【指导】
- Windows蓝屏错误0x00000018怎么处理
- c++中如何进行二进制文件读写_c++ read与
- php下载安装选zip还是msi格式_两种安装包对
- Win11怎么关闭透明效果_Windows11辅助
- PHP 中如何在函数内持久化修改引用变量的指向
- 用Python构建微服务架构实践_FastAPI与
- Win11怎么恢复出厂设置_Win11重置此电脑保
- 如何在包含多值的列中精准搜索指定演员?
- Win11关机界面怎么改_Win11自定义关机画面
- Mac的访达(Finder)怎么用_Mac文件管理
- Windows10系统更新错误0x80070002
- php中::能用于接口静态方法吗_接口静态方法调用
- PHP接收参数值为空怎么办_判断和处理空参数方法说


QQ客服