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; ?>
】
相关推荐
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- Win11怎么设置闹钟_Windows 11时钟应
- php会话怎么开启_session_start函数
- Win11怎么更改系统语言为中文_Windows1
- php下载安装包怎么选_threadsafe与nt
- PHP中require语句后直接调用返回对象方法的
- Win10怎么查看内存时序参数_Win10CPU-
- Windows怎样拦截QQ浏览器广告_Window
- PythonWeb前后端整合项目教程_FastAP
- c++ atoi和atof函数用法_c++字符数组
- Dapper的Execute方法的返回值是什么意思
- Python正则表达式实战_模式匹配说明【教程】
- Windows10如何重置此电脑_Windows1
- Win11怎么查看显卡显存_查询Win11显卡详细
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘
- php下载安装选zip还是msi格式_两种安装包对
- Python 模块的 __name__ 属性如何由
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- MAC如何修改默认应用程序_MAC文件后缀关联设置
- Win11怎么格式化U盘_Win11系统U盘格式化
- Go 语言标准库为何不提供泛型 Contains
- Windows系统时间服务错误_W32Time服务
- Windows家庭版如何开启组策略(gpedit.
- Win11怎么关闭VBS安全性_Windows11
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Windows怎样关闭Edge新标签页广告_Win
- php本地部署后数据库连接报错_1045acces
- Windows10系统怎么查看CPU温度_Win1
- c++20的std::format怎么用 比pri
- 如何在 Go 中比较自定义的数组类型(如 [20]
- 一文教你快速开通网站LOGO图
- Win10怎么关闭自动更新错误重启 Win10策略
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- Win11无法拖拽文件到任务栏怎么办_Win11开
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- php做exe支持多线程吗_并发处理实现方式【详解
- c++ try_emplace用法_c++ map
- c++ std::atomic如何保证原子性 c+
- windows 10应用商店区域怎么改_windo
- 如何用正则表达式精确匹配“start”到“end”
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- Windows服务启动类型恢复方法_错误修改导致的
- Win11怎么开启自动HDR画质_Windows1
- Windows11怎样开启游戏模式_Windows
- Python项目维护经验_长期演进说明【指导】
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- Win11任务栏怎么固定应用 Win11将软件图标
- Win11关机界面怎么改_Win11自定义关机画面
- Win10怎样设置多显示器_Win10多显示器扩展

QQ客服