In the following code, there are two instances of "undefined":
A:
b();
console.log(a);
var a = "Hello World!";
function b() {
console.log("Called b!");
}
This causes the console to show "Undefined" for "a".
B:
b();
console.log(a);
function b() {
console.log("Called b!");
}
This creates "Uncaught ReferenceError: a is not defined". In both cases a is undefined, and the console tells you that. But why does it choose to do it in different ways depending on the context? Are there a couple forms of "undefined" besides undefined and null?
In the following code, there are two instances of "undefined":
A:
b();
console.log(a);
var a = "Hello World!";
function b() {
console.log("Called b!");
}
This causes the console to show "Undefined" for "a".
B:
b();
console.log(a);
function b() {
console.log("Called b!");
}
This creates "Uncaught ReferenceError: a is not defined". In both cases a is undefined, and the console tells you that. But why does it choose to do it in different ways depending on the context? Are there a couple forms of "undefined" besides undefined and null?
Share Improve this question asked Mar 4, 2016 at 15:06 Bar AkivaBar Akiva 1,2093 gold badges16 silver badges27 bronze badges 5- Perhaps a better title would be more appropriate? – Daniel Cheung Commented Mar 4, 2016 at 15:09
- 4 I have googled and read about data types. Stop assuming people do not use google. In the future people are going to google a query that yields this question and waste their time reading your cliche "google it" response instead of just answering the question. – Bar Akiva Commented Mar 4, 2016 at 15:10
-
2
Personally I think the error message should read "
a
is not declared", it would certainly make it clearer than "not defined"... :) – Niet the Dark Absol Commented Mar 4, 2016 at 15:12 - meta: @BarAkiva "just google it" ments are not allowed on Stackoverflow because they're not useful. That being said, some proof is usually expected from the askee to show that they have already looked for answers elsewhere and not find anything. I'm not sure how much that applies here but this, in a nutshell, is the stackoverflow policy. – Halcyon Commented Mar 4, 2016 at 15:14
- Indeed. I see no reason why they would label it like that because it made me think there is some secret "undefined" I have yet to read about. – Bar Akiva Commented Mar 4, 2016 at 15:15
2 Answers
Reset to default 14The first code is treated as follow, because of hoisting.
var a; // Declare the variable
// Move function definitions to the top
function b() {
console.log("Called b!");
}
b();
console.log(a); // Undefined, no value assigned yet
a = "Hello World!";
console.log(a); // Hello World!
In the second code a
is never defined. And trying to access such variables will result in throwing ReferenceError.
Here's a blog to read more about hoisting.
The simple rule is:
- If variable is declared and not assigned any value it's
undefined
- If variable/function is not defined and attempting to use it will throw Reference Error
It's all about hoisting.
Basically your A block gets interpreted by Javascript as:
// Variable is declared, but without a value (undefined)
var a;
b();
console.log(a);
a = "Hello World!";
function b() {
console.log("Called b!");
}
So that's why you get an error in the second case: variable a is not defined anywhere.