ReferenceError: can't access lexical declaration`X' before initialization
The JavaScript exception "can't access lexical declaration `variable' before
initialization" occurs when a lexical variable was accessed before it was initialized.
This happens within any block statement, when
let
or
const
declarations are accessed before they are defined.
Message
ReferenceError: Cannot access 'X' before initialization (Edge)
ReferenceError: can't access lexical declaration `X' before initialization (Firefox)
ReferenceError: 'x' is not defined (Chrome)
Error type
What went wrong?
A lexical variable was accessed before it was initialized. This happens within any
block statement, when
let
or
const
declarations are accessed before they are defined.
Examples
Invalid cases
In this case, the variable "foo" is accessed, even before it is declared which throws an reference error ( because variables declared using let/const
are not hoisted ).
function test() {
// Accessing the variable foo before it's declared
console.log(foo); // ReferenceError: can't access lexical
let foo = 33; // 'foo' is declared here using the 'let' keyword
}
test();
Valid cases
In the following example, we correctly declare a variable using the let
keyword before accessing it, so we encounter no error. And in contrast, notice how we are accessing the bar
variable even before it is declared — without encountering any error. That's because of the hoisted nature of var
variables.
function test(){
// Declaring variable foo
let foo = 33;
console.log(foo, bar); // 33 undefined
var bar = 12;
}
test();