De http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
en JavaScript, que tiene declaración de la función:
function foo() {
}
y la función de la expresión
var foo = function() {
}
Citando http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
"Las declaraciones de función y las variables de función siempre se mueven ('hoisted') a la parte superior de su alcance JavaScript mediante el intérprete JavaScript ".
Así que lo que sucedió en su primer ejemplo es el declaración de la función de function a()
, obtiene izada a la parte superior del alcance de Javascript, por lo tanto la producción de 'foo' a pesar de que el caso se evalúa como falsa
Piense en var foo
como una declaración normal de Javascript, que sólo ha ejecutado en el tiempo de ejecución de JavaScript, a diferencia de function foo()
, es por eso que el siguiente es válido:
alert(foo());
function foo() {
return 'gw ganteng';
}
Aquí, function foo()
es analizada por el analizador, putti ng foo()
en el ámbito actual, antes de intentar llamar alert(foo())
http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
En ejecución JavaScript hay Contexto (que ECMA 5 se rompe en LexicalEnvironment, VariableEnvironment y ThisBinding) y Proceso (un conjunto de declaraciones ser invocado en secuencia). Las declaraciones contribuyen a VariableEnvironment cuando se ingresa el alcance de ejecución . Son distintos de las declaraciones (como devolución) y son no sujetos a sus reglas de proceso.
Me sale '19'. ¿Qué motor estás usando? –
jsfiddle: http://jsfiddle.net/Mqs8Y/ –
@DC_: El enlace me está dando '19' en mi consola (firefox). –