JavaScript中var声明存在提升,仅声明被提升至作用域顶部,赋值保留在原位,故声明前访问得undefined;let/const无提升,声明前访问抛ReferenceError;函数声明提升优先级高于var声明。

这是因为 JavaScript 的变量声明(var)存在“提升”(hoisting),但只有声明被提升,初始化(赋值)不会被提升。
变量声明被提升,赋值留在原地
var 声明的变量会在代码执行前被“移动”到当前作用域顶部(逻辑上),但它的赋值语句仍保留在原位置。因此,在声明语句之前访问该变量,会得到 undefined,而不是报错。
-
注意:只是声明被提升,不是赋值。比如
var a = 123;等价于先提升var a;,再在原位置执行a = 123; - 如果用
let或const,则不会提升声明——在声明前访问会抛出ReferenceError(暂时性死区)
一个典型例子
以下代码看似从上往下执行,但实际行为由提升机制决定:
console.log(a); // undefined var a = 42;
等价于(逻辑上):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
var a; console.log(a); // undefined a = 42;
函数声明与变量声明的提升优先级
当变量和函数同名时,函数声明的提升优先级高于 var 声明(但低于 let/const):
console.log(foo); // function foo() { return 'I am function'; }
var foo = 'I am string';
function foo() { return 'I am function'; }
原因:函数声明整体被提升到最前,然后 var foo 声明被提升(但不覆盖已有函数),最后赋值才发生。
如何避免被提升行为误导
- 始终在作用域顶部统一声明变量(显式写出
var/let/const) - 优先使用
let和const,它们不提升声明,更符合直觉 - 启用严格模式(
"use strict")可帮助捕获部分因提升导致的隐式全局等问题

















