ReferenceError 是 JavaScript 运行时错误,表示访问未声明或不可访问的变量、函数等;常见原因包括变量未声明、TDZ 访问、作用域外引用、严格模式下隐式全局赋值、全局 API 缺失及 this 绑定丢失导致的未声明变量引用。

ReferenceError 是 JavaScript 中最基础也最常遇到的运行时错误之一,它表示代码试图访问一个未声明或不可访问的变量、函数或标识符。它不是语法错误(SyntaxError),也不是类型不匹配(TypeError),而是在执行阶段,JavaScript 引擎在作用域链中完全找不到对应绑定时抛出的错误。
变量未声明就使用
这是最常见的根源。ES6 之后,用 let 或 const 声明的变量存在“暂时性死区”(TDZ),在声明语句执行前访问会直接报 ReferenceError;而 var 虽有变量提升,但若拼写错误或根本没写声明,同样触发该错误。
-
console.log(age); // ReferenceError: age is not defined(age 完全没声明) console.log(x); let x = 10; // ReferenceError: Cannot access 'x' before initialization-
myFunction(); // ReferenceError: myFunction is not defined(函数表达式未赋值就调用)
作用域外访问私有标识符
JavaScript 严格按词法作用域查找变量。块级作用域({})、函数作用域或模块作用域内的声明,默认对外不可见。跨作用域引用就会失败。
if (true) { let user = 'Alice'; } console.log(user); // ReferenceErrorfunction foo() { const secret = 42; } foo(); console.log(secret); // ReferenceError- ESM 模块中未
export的变量,在其他模块里import会报错(本质也是引用不存在的导出名)
全局对象属性缺失(尤其在严格模式下)
非严格模式中,给未声明变量赋值会自动挂到全局对象(如 window 或 globalThis)上;但严格模式禁用该行为,此时 name = 'Tom' 会直接抛 ReferenceError(因为 name 未声明)。另外,浏览器中误以为某些 API 是全局变量(如 fetch 在旧环境或 Node.js 中不存在),也会触发此错误。
立即学习“Java免费学习笔记(深入)”;
'use strict'; username = 'Bob'; // ReferenceError: username is not definedconsole.log(localStorage); // 可能 ReferenceError(某些嵌入式 JS 环境无该 API)- Node.js 里直接写
document.getElementById(...)—— document 不是全局变量,报错
this 绑定丢失导致属性访问失败
虽然更常引发 TypeError,但在某些场景下也会表现为 ReferenceError:比如箭头函数中错误地假设 this 指向某个对象,又用解构方式提取属性,而该对象为 undefined,解构时若未设默认值,可能触发对 undefined 属性的引用(不过严格来说这属于 TypeError)。真正关联 ReferenceError 的情况是:把方法单独提取后调用,又在内部用了未声明的变量名来替代 this.xxx,例如手误写成 xxx 而非 this.xxx。
const obj = { val: 100 }; function show() { console.log(val); } show(); // ReferenceError: val is not defined(本意是 this.val,但 this 不指向 obj,且 val 未声明)- 事件回调中忘记绑定
this,又在函数内直接写变量名代替this.property,而该变量未在作用域中声明










