未声明变量直接访问会报referenceerror,已声明未赋值变量值为undefined且不报错;typeof对未声明变量返回"undefined"是安全的,但无法区分未声明与值为undefined。

未定义的变量会直接报错,未赋值的变量不会报错,只会返回 undefined。
未声明(not defined):访问即报 ReferenceError
变量根本没用 var、let 或 const 声明过,就直接使用,JavaScript 引擎找不到这个标识符,立刻抛出错误:
-
console.log(a);→ReferenceError: a is not defined - 错误发生在代码执行阶段,程序中断,后续语句不运行
-
typeof a虽然也返回"undefined",但这只是引擎对非法引用的“兜底提示”,不能用来安全判断是否声明过
已声明但未赋值:值为 undefined,不报错
只要用了声明关键字(哪怕只写 let x; 或 var y;),变量就在作用域中存在,只是当前没有值:
-
let x; console.log(x);→ 输出undefined,无报错 -
var z; typeof z返回"undefined",这是合法状态 - 函数参数未传、对象属性不存在、函数无 return,返回的也是
undefined
容易混淆的“隐式全局”陷阱
在非严格模式下,函数内不声明就直接赋值,会意外创建全局变量:
-
function f() { msg = 'hello'; } f(); console.log(msg);→ 输出"hello",不报错 - 这看起来像“未声明却能用”,实际是引擎自动在全局对象上挂了属性,属于不良实践
- 严格模式下(
"use strict";)会直接报ReferenceError
怎么安全判断一个变量是否存在?
不能靠 typeof xxx === "undefined" 区分“未声明”和“已声明未赋值”,因为两者都返回 true。真正安全的方式是:
- 检查全局对象属性:
"xxx" in window(浏览器)或"xxx" in globalThis - 用
try...catch捕获引用错误(仅限必要场景) - 更推荐的做法:确保变量始终显式声明,避免依赖未声明变量的逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











