javascript作用域是什么_全局作用域和函数作用域如何理解【教程】
技术百科
幻影之瞳
发布时间:2026-01-27
浏览: 次 JavaScript作用域是引擎查找变量时严格遵循的路径规则,分为全局、函数和块级三种:全局变量挂window(仅var)、函数作用域绑定调用、块级作用域由{}与let/const触发;作用域链决定变量向上逐层查找。
JavaScript 作用域不是“变量在哪能用”的模糊概念,而是**引擎查找变量时严格遵循的一套路径规则**。全局作用域和函数作用域的区别,不在于“写在哪”,而在于**变量绑定的位置、可访问的边界,以及生命周期是否受函数调用控制**。
全局作用域:所有代码都能看到的“公共广场”,但别乱扔东西
在 标签最外层或独立 JS 文件顶层声明的变量(var、let、const),就进了全局作用域。浏览器中它会自动挂到 window 上(仅 var 声明的会)。
-
var globalA = 1→window.globalA存在,可跨 script 访问 -
let globalB = 2→window.globalB是undefined,但它仍是全局变量,任何地方都能读写 - 直接写
noVar = 3→ 隐式挂到window.noVar,污染严重,禁止使用 - 全局变量不会被 GC 回收,直到页面关闭;命名冲突风险高(比如两个库都定义了
data)
函数作用域:每次调用都新建一个“隔离房间”,关*

函数内部用 var 声明的变量,只属于这个函数——注意,是“函数作用域”,不是“块作用域”。哪怕它写在 if 或 for 里,只要没用 let/const,它就逃不出这个函数。
-
function fn() { var x = 10; if (true) { var y = 20; } console.log(y); // ✅ 输出 20 }——y不是if的,是fn的 -
console.log(x); // ❌ ReferenceError—— 函数外完全不可见 - 每次调用
fn()都创建全新作用域,互不影响(形参也是局部变量) - 函数执行完,若无闭包引用,整个作用域连带变量通常被销毁
块级作用域(ES6):不是函数作用域的子集,而是并列的新玩家
很多人误以为 if{} 或 for{} 里的 let 变量属于“函数作用域的一部分”——错。它是独立的块级作用域,和函数作用域平级,由 {} 和 let/const 共同触发。
-
function test() { if (true) { let z = 30; } console.log(z); // ❌ ReferenceError }——z只活在那个{}里 -
var在块内声明 ≠ 块级作用域:if(true) { var w = 40; } console.log(w); // ✅ 40 -
catch块也有自己的作用域:try { throw 1; } catch(e) { console.log(e); } console.log(e); // ❌ e is not defined
作用域链:变量不是“就近找”,而是“向上逐层查”
函数执行时,JS 引擎按“当前作用域 → 外层函数作用域 → … → 全局作用域”顺序查找变量。找不到就报 ReferenceError。这不是语法糖,是运行时真实发生的链式查找。
function outer() { const a = 'outer'; function inner() { console.log(a); // ✅ 找到 outer 里的 a } inner(); }- 嵌套越深,链越长,性能影响微乎其微,但理解它才能避开“为什么这里能访问到那个变量”的困惑
- 闭包的本质就是:内层函数记住了它创建时所处的作用域链,即使外层函数已执行完毕
var 当成块级作用域用,或者在函数里漏写 var/let/const 导致意*全局。这些错误不会立刻报错,却会在后期引发难以追踪的覆盖和内存泄漏。
# 浏览器
# win
# js
# javascript
# java
# if
# 区别
# 为什么
# var
# 作用域
# try
# throw
# catch
# 闭包
# for
# const
# 局部变量
# 全局变量
# es6
# 形参
相关栏目:
<?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; ?>
】
相关推荐
- 如何在 Windows 11 中使用 AlomWa
- Python函数接口稳定性_版本演进解析【指导】
- Python并发安全问题_资源竞争说明【指导】
- php订单日志怎么在swoole写_php协程sw
- 如何使用Golang实现负载均衡_分发请求到多个服
- 如何解决Windows时间不准的问题?(自动同步设
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Windows怎样拦截WPS弹窗广告_Window
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win11输入法选字框不见了怎么办_Win11输入
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- Mac电脑进水了怎么办_MacBook进水后紧急处
- 如何使用Golang实现微服务状态监控_Golan
- windows 10应用商店区域怎么改_windo
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Win11如何更改任务栏颜色 Win11自定义任务
- Python深度学习实战教程_神经网络模型构建与训
- Python与GPU加速技术_CUDA与Numba
- Python集合操作技巧_高效去重解析【教程】
- Windows10怎样连接蓝牙设备_Windows
- mac本地php环境如何开启curl_curl扩展
- Win11怎么设置触控板手势_Windows11三
- Win11时间怎么同步到原子钟 Win11高精度时
- 如何用::实现工具类方法调用_php静态工具类设计
- Mac系统更新下载慢或失败怎么办_解决macOS升
- 如何在Golang中使用log包输出不同级别日志_
- Windows服务启动类型恢复方法_错误修改导致的
- Win11怎么关闭专注助手 Win11关闭免打扰模
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Go 语言标准库为何不提供泛型切片的 Contai
- 如何使用Golang搭建本地API测试环境_快速验
- Win10如何更改用户账户控制_Windows10
- 如何使用Golang搭建Web开发环境_快速启动H
- Win11怎么关闭搜索历史 Win11清除搜索框最
- Python lxml的etree和Element
- Win11声音忽大忽小怎么办 Win11音频增强功
- Win10如何卸载自带Edge_Win10彻底卸载
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- Python与MongoDB NoSQL开发实战_
- phpstudy本地环境mysql忘记密码_重置m
- Windows 10怎么录屏_Windows 10
- php与c语言在嵌入式中有何区别_对比两者在硬件控
- 如何使用Golang指针与结构体结合_修改结构体内
- Win11如何卸载OneDrive_Win11卸载
- php删除数据怎么清空表_truncate与del
- 如何在 Go 同包不同文件中正确引用结构体
- Go 中 defer 语句在 goroutine
- Django 密码修改后会话失效的解决方案
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Windows10电脑怎么设置文件权限_Win10

QQ客服