简体   繁体   中英

JavaScript Scope: Global Variable Confusion

I am having trouble understanding why the following code prints 1 and not 10. I thought that console.log would print 10 because if a variable is not declared within a function it is part of the global scope.

If I remove the line, function a(){} , the console.log statement prints 10. Can someone please explain why the presence of this line affects the value of a .

Additionally, if this question can be refined I would appreciate any suggestions

 function b() { a = 10; return; function a(){} } var a = 1; b(); console.log(a); 

Just add console.log(a); to your function and you will realize that 'a' is a function that has local scope, which means, it inside function b() and can't really be called from outside. Hence, the value of a remains as 1, as nothing really affects it.

 function b() { console.log(a); a = 10; return; function a(){} } var a = 1; b(); console.log(a); 

Function declarations create local variables, and all declared variables are hoisted to the top of their containing function scope. Thus, you have something equivalent to:

function b() { 
    function a(){}
    a = 10; 
    return;
} 

which is in turn roughly equivalent to

function b() { 
    var a = function(){}
    a = 10; 
    return;
} 

As you can see in this form, it's clear that a is a local variable, so a = 10 assigns a value to the local a , not the global a .

Because both function declarations and variables are treated similarly under the hood.

When a function is called, its contents are first parsed to configure the stack frame ready for its execution.

As part of this process, function declarations and variables are inserted as identifier/value pairs into the same data structure (Environment Record inside the Lexical Environment) inside the stack frame (Execution Context) created when a function is called.

So by declaring a function a inside b , you create an identifier named "a" in the Environment Record created for the call to b , shadowing a in the outer context.

So a in the outer context remains 1 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM