utiliza - retornar valor de una funcion javascript
Si las funciones en JS son de primera clase, ¿qué les permite ser llamadas antes de que se definan? (4)
La declaración de función y la declaración de variable siempre se moverán a la parte superior de su alcance.
console.log(foo());
function foo() {
return ''bar'';
}
se interpreta como:
function foo() {
return ''bar'';
}
console.log(foo());
console.log(foo());
var foo = function () {
return ''bar'';
};
se interpreta como:
var foo;
console.log(foo());
foo = function () {
return ''bar'';
};
¿Las funciones de primera clase no significan que se comporten como variables? Claramente, no se comportan exactamente como variables, ya que esto:
console.log(foo);
var foo = ''bar'';
... no funciona, mientras que esto:
console.log(foo());
function foo() {
return(''bar'');
}
...hace.
Dicho esto, esto:
console.log(foo());
var foo = function() { return ''bar''; };
no funciona, que es más consistente.
¿Lo que da?
Las declaraciones de funciones se transfieren automáticamente a la parte superior del alcance en JS
console.log(foo());
function foo() {
return(''bar'');
}
en realidad se interpreta como
function foo() {
return(''bar'');
}
console.log(foo());
el segundo bit de código funciona de esa manera, porque foo es variable, no una función (simplemente tiene una función anónima como valor). Las variables también se golpean hacia arriba, por lo
console.log(foo());
var foo = function() { return ''bar''; };
se convierte
var foo; //empty variable
console.log(foo()); //undefined
foo = function() { return ''bar''; }; //creates a function without name and assigns it to foo
Lo que estás experimentando se llama izar. Cuando se usa una declaración de función como:
function foo() {}
foo
moverá a la parte superior del alcance más cercano (función).
Por otro lado, cuando usa una expresión de función o asignación de función como:
var foo = function() {}
la variable foo
moverá a la parte superior, pero la asignación se producirá cuando sea necesario.
Porque no comparas lo mismo. En su ejemplo, compara la función de declaración de function foo()...
con declaración de variables y asignación en var foo = ''bar'';
Una comparación más correcta sería de:
console.log(foo);
var foo = ''bar'';
con
console.log(foo());
var foo = function() {
return ''bar'';
}
La declaración funcional se interpreta de manera diferente debido a la forma en que funciona el izado . Alzando mueve todas las declaraciones a la parte superior del alcance más cercano, mientras deja las asignaciones en su lugar.
La declaración de función es especial en ese sentido, ya que se trata tanto de declaración como de expresión / asignación en una declaración y, por lo tanto, se izan juntas.
Como ejemplo: puedes ver expresiones como:
console.log(foo);
var foo = ''bar'';
como esto:
var foo;
console.log(foo); //prints undefined
foo = ''bar'';
y
console.log(foo());
var foo = function() {
return ''bar'';
}
como esto:
var foo;
console.log(foo());
foo = function() {
return ''bar'';
}