Surprised that global variable has undefined value in JavaScript

iamjustcoder :

Today, I got completely surprised when I saw that a global variable has undefined value in certain case.

Example:

var value = 10;
function test() {
    //A
    console.log(value);
    var value = 20;

    //B
    console.log(value);
}
test();

Gives output as

undefined
20

Here, why is the JavaScript engine considering global value as undefined. I know that JavaScript is an interpreted language. How is it able to consider variables in the function?

Is that a pitfall from the JavaScript engine?

Joseph Silber :

This phenomenon is known as: JavaScript Variable Hoisting.

At no point are you accessing the global variable in your function; you're only ever accessing the local value variable.

Your code is equivalent to the following:

var value = 10;

function test() {
    var value;
    console.log(value);

    value = 20;
    console.log(value);
}

test();

Still surprised you're getting undefined?


Explanation:

This is something that every JavaScript programmer bumps into sooner or later. Simply put, whatever variables you declare are always hoisted to the top of your local closure. So, even though you declared your variable after the first console.log call, it's still considered as if you had declared it before that.
However, only the declaration part is being hoisted; the assignment, on the other hand, is not.

So, when you first called console.log(value), you were referencing your locally declared variable, which has got nothing assigned to it yet; hence undefined.

Here's another example:

var test = 'start';

function end() {
    test = 'end';
    var test = 'local';
}

end();
alert(test);

What do you think this will alert? No, don't just read on, think about it. What's the value of test?

If you said anything other than start, you were wrong. The above code is equivalent to this:

var test = 'start';

function end() {
    var test;
    test = 'end';
    test = 'local';
}

end();
alert(test);

so that the global variable is never affected.

As you can see, no matter where you put your variable declaration, it is always hoisted to the top of your local closure.


Side note:

This also applies to functions.

Consider this piece of code:

test("Won't work!");

test = function(text) { alert(text); }

which will give you a reference error:

Uncaught ReferenceError: test is not defined

This throws off a lot of developers, since this piece of code works fine:

test("Works!");

function test(text) { alert(text); }

The reason for this, as stated, is because the assignment part is not hoisted. So in the first example, when test("Won't work!") was run, the test variable has already been declared, but has yet to have the function assigned to it.

In the second example, we're not using variable assignment. Rather, we're using proper function declaration syntax, which does get the function completely hoisted.


Ben Cherry has written an excellent article on this, appropriately titled JavaScript Scoping and Hoisting.
Read it. It'll give you the whole picture in full detail.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Why a variable defined global is undefined?

Global variable is undefined at the module level

JavaScript: global array variable returned undefined

JS Global variable is undefined in setTimeout

Global variable becomes undefined after being assigned new value in function

Javascript - Checking if variable has been set gives me undefined error

GLTFLoader global variable undefined

PHP to JavaScript Confirm Message Box Variable Undefined (but has value)?

Why does the global variable value show up as undefined?

Javascript change value of global variable

Javascript global variable remains 'undefined' after changing it in a function

Global variable goes undefined on page refresh JAVASCRIPT

JavaScript global variable becomes undefined inside function

Why Javascript code prints 'undefined' even when variable is declared global?

Javascript: TypeError: variable.value is undefined

Global variable undefined in function

protractor checking value of a javascript global variable

Javascript: While the variable is declared in global scope, it remains undefined inside the function

Laravel ErrorException & Undefined variable even though the variable is defined and has a value

Global variable in Javascript, rerurn wrong value

JavaScript global variable is shown as undefined in Google Chrome console

In JavaScript, why does this global variable become undefined in my function?

JavaScript Global Variable Not Updating Value

Get Django variable in Javascript : undefined value

Global variable not working in NodeJS undefined

Why is variable undefined in global object even though it has not been defined?

Javascript global variable with async/await is set, but later undefined

Get only undefined value from my global variable configured with Context

Trying to change the value of a global variable, variable is undefined error in React