0

0

JavaScript 中的 var 声明具有函数作用域而非块作用域

心靈之曲

心靈之曲

发布时间:2026-01-31 08:55:02

|

581人浏览过

|

来源于php中文网

原创

JavaScript 中的 var 声明具有函数作用域而非块作用域

本文详解 `var` 变量为何能在 `if/else` 块内声明后被父函数直接访问,而无法在嵌套函数中同理使用,并对比 `let`/`const` 的块级作用域行为,帮助开发者彻底理解 javascript 作用域机制。

在 JavaScript 中,变量的作用域规则是理解代码行为的关键。一个常见误区是认为 if 或 else 语句会创建独立的作用域——实际上,if、else、for、while 等语句块本身不构成作用域边界;只有函数(function)模块(module)(以及 ES6 引入的 let/const 块级作用域)才定义新的作用域。

✅ var 是函数作用域(Function-scoped)

使用 var 声明的变量会被“提升”(hoisted)到其所在函数的顶部,且在整个函数体内均可见,无论它实际出现在哪个代码块中。因此:

function test() {
  var a = 2;
  if (a) {
    var b = 3; // 被提升至 test 函数顶部,等价于:var b; → b = 3;
  }
  console.log(b); // ✅ 输出 3 —— b 在整个 test 函数内有效
}
test();

上述代码等效于:

function test() {
  var a = 2;
  var b; // 提升发生,但尚未赋值
  if (a) {
    b = 3; // 赋值
  }
  console.log(b); // 3
}

❌ 嵌套函数拥有独立作用域

而当 b 在内部函数 test_2 中用 var 声明时,它属于 test_2 的函数作用域,对外部函数 test 不可见:

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

HaiSnap
HaiSnap

一站式AI应用开发和部署工具

下载
function test() {
  function test_2() {
    var b = 3; // 仅在 test_2 内部有效
  }
  test_2();
  console.log(b); // ❌ ReferenceError: b is not defined
}
test();

这是因为每个函数都创建自己的词法环境(Lexical Environment),var b 的作用域被严格限制在 test_2 内部。

? 对比 let 和 const:真正的块级作用域

ES6 引入的 let 和 const 遵循块级作用域(Block-scoped),即 {} 包裹的任意语句块(包括 if、for、{} 直接块)都会形成作用域边界:

function demo() {
  if (true) {
    let blockLet = 'inside';
    const blockConst = 'also inside';
    var functionVar = 'function-scoped';
  }

  console.log(functionVar);     // ✅ 'function-scoped'
  console.log(blockLet);       // ❌ ReferenceError
  console.log(blockConst);     // ❌ ReferenceError
}
demo();
? 小贴士:var 的函数作用域 + 变量提升特性容易引发意料之外的行为(如循环中闭包问题)。现代开发中,优先使用 const,仅在需重新赋值时用 let,可显著提升代码可预测性与可维护性。

✅ 总结

特性 var let / const
作用域类型 函数作用域 块级作用域
是否提升 是(声明 + 初始化为 undefined) 是(声明提升,但不初始化 —— 存在“暂时性死区”TDZ)
重复声明 允许(无报错) 不允许(SyntaxError)
全局污染 污染全局对象(如 window) 不污染全局对象

理解这一根本差异,是写出健壮、可调试 JavaScript 代码的基础。避免依赖 var 的函数作用域“穿透”行为,转而用清晰的块级作用域表达逻辑意图。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2025.12.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

781

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.25

c语言const用法
c语言const用法

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

531

2023.09.20

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

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

137

2025.07.29

undefined是什么
undefined是什么

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

5397

2023.07.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

32

2026.01.31

热门下载

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

精品课程

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

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

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

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