javascriptfunctionscopehoistingname-binding

What happens when JavaScript variable name and function name is the same?


I have the following code, where I declare a function and after it, a variable with the same name as the function:

function a(x) {
    return x * 2;
}

var a;
alert(a);

I expected this to alert undefined, but if I run it, the alert will display the following:

function a(x) {
    return x * 2
}

If I assign a value to the variable (like var a = 4), the alert will display that value (4), but without this change a will be recognized as a function.

Why is this happening?


Solution

  • Functions are a type of object which are a type of value.

    Values can be stored in variables (and properties, and passed as arguments to functions, etc).

    A function declaration:

    A var statement:

    Both your declaration and var statement are hoisted. Only one of them assigns a value to the variable a.