The first log example is 3, because any variable that is initialized inside a function using the var keyword will have a local scope. If a variable is initialized inside a function without var, it will have a global scope. any variable that is initialized inside a function using the var keyword will have a local scope. If a variable is initialized inside a function without var, it will have a global scope.
So, in the first case, when a local x is assigned, since it is not initialized, it is assigned 3.
While in the second case, x refers to the global variable x , since x not declared inside the function.
Instead, if you try this
<script> x = 5; $(function() { x = x || 3; console.log(x); }); </script>
OR
<script> x = 5; $(function() { var x = window.x || 3; console.log(x); }); </script>
You will get the expected result 5 .
In addition, unlike C and its family (which has a block level scope ), JavaScript has a functional level scope . Blocks, such as if statements, do not create a new scope. Only functions create a new area.
So, if I wrote something like
#include <stdio.h> int main() { int x = 1; printf("%d, ", x); // 1 if (1) { int x = 2; printf("%d, ", x); // 2 } printf("%d\n", x); // 1 }
OUTPUT: 1,2,1
compared with
var x = 1; console.log(x); // 1 if (true) { var x = 2; console.log(x); // 2 } console.log(x); // 2
OUTPUT: 1,2,2
Check out this excellent JavaScript blog post, Scoping and Histing , to better understand it.