¿Cuándo uso paréntesis y cuándo no?
¿Cómo es que puedo decir:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
¿Por qué la llamada de función setTimeout
no requiere paréntesis, pero la última línea sí?
Cáscara de nuez
myFunction
hace referencia a la funciónmyFunction()
llama a la función
Mas palabras
setTimeout
espera una referencia de función * como argumento.
Hay circunstancias en las que setTimeout(myFunction(), 1000)
podría tener sentido, como si myFunction()
devuelve una función, por ejemplo
function myFunction() {
return function() {
alert("ohai")
}
}
// Or
const myFunction = () => () => alert("ohai")
Entonces:
setTimeout(myFunction(), 1000);
setTimeout
obtiene el valor de retorno demyFunction
myFunction
devuelve una función (que llamaalert
)
lo que significa que habrá una alerta cada segundo.
Consulte también ¿Por qué la declaración de función requiere un nombre?
* O una cadena para evaluar, pero se prefiere una referencia.
myFunction
es una función
myFunction()
llama a la función y produce cualquier valor que devuelva la función.
El propósito de setTimeout es ejecutar código después de que transcurra un tiempo. Debe pasarle solo la función (para que setTimeout pueda llamar a la función cuando sea apropiado) porque si llama a la función (con el paréntesis) antes de pasarla a setTimeout, se ejecutará ahora en lugar de después de 1 segundo.
Cuando usas el paréntesis, dice "llamar a esta función ahora". Entonces, si dice setTimeout(myFunction(),1000);
, utilizará el valor de retorno de la función como devolución de llamada para el tiempo de espera. Si el valor de retorno de la función no es en sí mismo una función, obtendrá un error porque intentará ejecutar algo que no es ejecutable después del tiempo de espera (una cadena, un número, indefinido, etc.).
En la línea 2, la función myFunction
no se llama, sino que se pasa como argumento a la setTimeout
función, mientras que en la línea 4 myFunction
se llama; Para llamar a una función, siempre hay que utilizar paréntesis, incluso si no hay argumentos.