Estoy aprendiendo JavaScript y recientemente he aprendido sobre eventos de sincronización de JavaScript. Cuando me enteré setTimeout
en W3Schools , noté una figura extraña con la que no me había encontrado antes. Están usando comillas dobles y luego llaman a la función.
Ejemplo:
setTimeout("alertMsg()", 3000);
Sé que las comillas dobles y simples en JavaScript significan una cadena.
También vi que puedo hacer lo mismo así:
setTimeout(alertMsg, 3000);
Con los paréntesis se refiere, sin los paréntesis se copia. Cuando estoy usando las comillas y los paréntesis, se está volviendo loco.
Me alegraría si alguien me puede explicar la diferencia entre estas tres formas de uso setTimeout
:
Con los paréntesis:
setTimeout("alertMsg()", 3000);
Sin las comillas y los paréntesis:
setTimeout(alertMsg, 3000);
Y el tercero solo usa comillas:
setTimeout("alertMsg", 3000);
NB: Una mejor fuente de setTimeout
referencia sería MDN .
fuente
mysql_
extensión de PHP) de las cuales la secuencia de preguntas SO es solo un ejemplo. IIRC también hubo algunos errores muy sutiles en la sección SQL, pero ha pasado casi un año desde la última vez que visité el sitio web y muchos de ellos también podrían repararse. E incluso si todo lo anterior fuera perfecto, no promocionaría un sitio web que intente engañar a las personas con el fraude de su certificado.Respuestas:
Usando
setInterval
osetTimeout
Debe pasar una referencia a una función como primer argumento para
setTimeout
osetInterval
. Esta referencia puede ser en forma de:Una función anónima
Un nombre de una función existente
Una variable que apunta a una función existente.
Tenga en cuenta que establezco "variable en una función" por separado del "nombre de la función". No es evidente que las variables y los nombres de las funciones ocupen el mismo espacio de nombres y puedan golpearse entre sí.
Pasando argumentos
Para llamar a una función y pasar parámetros, puede llamar a la función dentro de la devolución de llamada asignada al temporizador:
Hay otro método para pasar argumentos al controlador, sin embargo, no es compatible con varios navegadores .
Contexto de devolución de llamada
Por defecto, el contexto de la devolución de llamada (el valor de
this
dentro de la función llamada por el temporizador) cuando se ejecuta es el objeto globalwindow
. Si desea cambiarlo, úselobind
.Seguridad
Aunque es posible, no debe pasar una cadena a
setTimeout
osetInterval
. Pasar una cadena creasetTimeout()
osetInterval()
usa una funcionalidad similar a laeval()
que ejecuta cadenas como secuencias de comandos , lo que hace posible la ejecución de secuencias de comandos arbitrarias y potencialmente dañinas.fuente
Creo que la función setTimeout que escribes no se está ejecutando. si usa jquery, puede hacer que se ejecute correctamente haciendo esto:
fuente
Totalmente de acuerdo con Joseph.
Aquí hay un violín para probar esto: http://jsfiddle.net/nicocube/63s2s/
En el contexto del violín, el argumento de cadena no funciona, en mi opinión porque la función no está definida en el ámbito global.
fuente
Lo que sucede en realidad en caso de que pase una cadena como primer parámetro de función
Este valor del primer parámetro se evaluó cuando es hora de ejecutarse (después
number
de transcurridos milisegundos). Básicamente es igual aEsto es
Por lo tanto, las muestras a las que se refiere no son buenas muestras y se pueden dar en un contexto diferente o simplemente un error tipográfico.
Si invoca de esta manera
setTimeout(something, number)
, el primer parámetro no es una cadena, sino un puntero a algo llamadosomething
. Y nuevamente sisomething
es una cadena, entonces se evaluará. Pero si es función, entonces la función se ejecutará. muestra jsbinfuente
fuente
Con los paréntesis:
Sin las comillas y los paréntesis:
Y el tercero solo usa comillas:
fuente