Search code examples
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:

    • Creates a named function
    • Creates a variable in the current scope with the same name as the function (unless such a variable already exists)
    • Assigns the function to that variable
    • Is hoisted

    A var statement:

    • Creates a variable in the current scope with the specified name (unless such a variable already exists)
    • Is hoisted
    • Doesn't assign a value to that variable (unless combined with an assignment operator)

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