Escribí el siguiente script solo para ver qué sucede cuando una variable y una función que tiene una función asignada tienen sus nombres en conflicto:
var f = function() {
console.log("Me original.");
}
function f() {
console.log("Me duplicate.");
}
f();
El resultado que obtengo es "Yo original". ¿Por qué no se llamó a la otra función?
Además, si cambio mi asignación original a var f = new function() {
, obtengo "Me original", seguido de un mensaje TypeError object is not a function
. ¿Alguien puede explicarme?
javascript
function
ankush981
fuente
fuente
Respuestas:
Las declaraciones de funciones se elevan (se mueven a la parte superior) en JavaScript. Si bien es incorrecto en términos de orden de análisis, el código que tiene es semánticamente el mismo que el siguiente, ya que las declaraciones de función se elevan:
Que a su vez, con la excepción del nombre de la función es el mismo que:
Lo que a su vez, debido a la elevación variable, es lo mismo que:
Lo que explica lo que está obteniendo, está anulando la función. De manera más general,
var
se permiten múltiples declaraciones en JavaScript,var x = 3; var x = 5
es perfectamente legal. En el nuevo estándar ECMAScript 6, laslet
declaraciones lo prohíben.Este artículo de @kangax hace un trabajo fantástico al desmitificar funciones en javascript
fuente
function f()
alvar f = function()
tanto? ¿Son realmente los nombres de elevación y función la única diferencia?f
se levantan, y la"Me Original"
versión simplemente se levanta más tarde , cada una se mueve a la parte superior pero en el mismo orden. Solo me gustaría agregar que, en general, no debe nombrar varias funciones de la misma manera :)var
el mismo nombre dos veces en el mismo ámbito.Si no parece que nadie haya respondido su pregunta de seguimiento, la responderé aquí, aunque generalmente debe hacer preguntas de seguimiento como preguntas separadas.
Preguntaste por qué esto:
imprime "Me original". y luego un error.
Lo que está sucediendo aquí es que
new
hace que la función se use como constructor. Entonces esto es equivalente a lo siguiente:Y gracias a la función izar que explicó Benjamin, lo anterior es esencialmente equivalente a esto:
Esta expresión:
hace que se construya y asigne un nuevo objeto
f
, utilizando una función anónima como constructor. "Yo original". se imprime a medida que se ejecuta el constructor. Pero el objeto que se construye no es en sí mismo una función, por lo que cuando finalmente se ejecuta:obtiene un error, porque
f
no es una función.fuente
Perdóname si esta es la forma incorrecta de abordar la adición de un punto. No he estado mucho por aquí y agradecería una dirección constructiva y / o críticas.
La respuesta de Benjamin aborda la pregunta del OP de manera excelente, pero me gustaría agregar un ajuste que nos dará un recorrido completo por el izado y sus rarezas.
Si comenzamos el código original con una llamada a
f
, así:La salida será entonces:
La razón es que las declaraciones
var
yfunction
se expresan de maneras ligeramente diferentes.Porque
var
la declaración se mueve a la parte superior del alcance actual *, pero no se eleva ninguna asignación . En lo que respecta al valor de la var declarada, no está definido hasta que se alcanza la línea de asignación original.Para las
function
declaraciones , se incluyen tanto la declaración como la definición. Las expresiones de función , tal como se utilizan en lavar f = function() {...
construcción, no se elevan.Entonces, después de izar, la ejecución es como si el código fuera:
* Todo el alcance de JavaScript es léxico, o de función, pero parece que confundir las cosas con usar la palabra f en ese punto.
fuente