Don't first class functions mean that they behave as variables? Clearly they don't behave exactly like variables though, since this:
console.log(foo);
var foo = 'bar';
...doesn't work, whereas this:
console.log(foo());
function foo() {
return('bar');
}
...does.
That said, this:
console.log(foo());
var foo = function() { return 'bar'; };
doesn't work, which is more consistent.
What gives?
Function declarations are automatically bumped to top of the scope in JS
is actually interpreted as
the second bit of code is working that way, because foo is variable, not a function (it just happens to have an anonymous function as a value). Variables are also bumped to top, so
becomes
Because you don't compare the same thing. In your example - you compare function declaration
function foo()...
with variable declaration and assignment invar foo = 'bar';
A more correct comparison would be of:
with
The functional declaration is interpreted differently due to the way hoisting works. Hoisting moves all declarations to the top of the closest scope, while leaving assignments in their place.
Function declaration is special in that sense, since it's both declaration and expression/assignment in one statement and thus hoisted together.
As an example: you can look at expressions like:
as this:
and
as this:
What you're experiencing is called hoisting. When using a function declaration like:
foo
will be moved to the top of the closest scope (function).On the other hand when you use a function expression or function assignment like:
the variable
foo
will be moved to the top but the assignment will occur when is needed.Learn more
Function declaration and variable declaration will always be moved to the top of their scope.
is interpreted as:
is interpreted as: