40 lines
1.1 KiB
Markdown
40 lines
1.1 KiB
Markdown
The result is: **error**.
|
|
|
|
Try running it:
|
|
|
|
```js run
|
|
let x = 1;
|
|
|
|
function func() {
|
|
*!*
|
|
console.log(x); // ReferenceError: Cannot access 'x' before initialization
|
|
*/!*
|
|
let x = 2;
|
|
}
|
|
|
|
func();
|
|
```
|
|
|
|
In this example we can observe the peculiar difference between a "non-existing" and "uninitialized" variable.
|
|
|
|
As you may have read in the article [](info:closure), a variable starts in the "uninitialized" state from the moment when the execution enters a code block (or a function). And it stays uninitalized until the corresponding `let` statement.
|
|
|
|
In other words, a variable technically exists, but can't be used before `let`.
|
|
|
|
The code above demonstrates it.
|
|
|
|
```js
|
|
function func() {
|
|
*!*
|
|
// the local variable x is known to the engine from the beginning of the function,
|
|
// but "unitialized" (unusable) until let ("dead zone")
|
|
// hence the error
|
|
*/!*
|
|
|
|
console.log(x); // ReferenceError: Cannot access 'x' before initialization
|
|
|
|
let x = 2;
|
|
}
|
|
```
|
|
|
|
This zone of temporary unusability of a variable (from the beginning of the code block till `let`) is sometimes called the "dead zone".
|