JS: var Name Scope
Note: var deprecated
Note: The use of var
is deprecated since ES2015, due to its name hoisting complexity and name scope complexity 〔see var Name Scope〕 , you should never use var
. Use let Declaration instead.
function-level scope
Name declared with var
has scope to nearest outer function's curly bracket {}
.
This variable scoping rule is called function-level scope.
name scope means where the name can be seen. (that is, have meaning.)
// Name declared with var has scope to nearest outer function's curly bracket {}. function f() { var n = 3; { var n = 4; } return n; } console.log(f()); // prints 4
If a var
declaration is not inside function, then its scope is global. 〔see Global Variable〕
Note: the
function-level scope
applies only for variable declared with var
. It does not apply to variable declared with
let
or const
.
〔see let Declaration〕
Using Function to Emulate Block Scope
In pre-JS2015 code, you will often see that a function is used purely for the purpose of containing variable inside as local variables, like this:
(function(){
var x; // local var x
// …
}());
This will create a function, and immediately evaluate it. Here's a example.
function f() { var n = 3; (function () { var n = 4; })(); return n; } console.log(f()); // prints 3
Function Scope as Namespace
JavaScript pre-JS2015 does not have modules or namespace. One hack to achieve namespace is wrapping the entire source code of your package inside a function. Like this:
(function nicePackage() { // your source code here })();
This way, when your package/file is loaded, it only introduces one name into the global space.