This pattern of function declaration shown in the first example is called NFE (named function expression), while the othher one is called function declaration. The big difference is, in case of NFE, the function's name, i.e. c
in our case lives only incide the scope of the function. Therefore, if you will try to call it by its' name from outside wou will get the error, c is not defined
, which means c
doesn't exist globally.
b = function c(){
console.log(c);
c=3;
console.log(c);
}
c(); //c is not defined
Now look closely at the line c=3
inside the function body of c. What this code block normally would have done, is create a global variable by the name c, outside the function body, which would have been accessible, outside the function as well. But, here, as the c
already lives inside the scope of the function's own body, it will not let you declare there, cause it will mean to overwrite its' own name, which is not allowed in case of NFE, (but allowed in case of function declaration, i.e, the second example in question). That is precisely why the assignment code, c=3
is not doing anything here.
To realize it more closely, you can update c=3
with var c=3
, in which case it will let you declare a local variable by the name of c
inside your function body, which you can then use inside the function.
b = function c(){
console.log(c);
var c=3;
console.log(c);
}
b();