tambien es valida de la forma tradicional. es decir, pasando las instrucciones como en un string. o sea,
Código:
setTimeout("promptWelcome('preFIXE_Media/welcome_page.png'); /*mas expresiones*/ expresion1; expresion2; /*etc...*/", 5000);
¿donde realmente esta la diferencia? aunque ambas soluciones son validas, realmente tienen sus diferencias y me atreveria a decir quien lleva mas ventaja es la opcion de la funcion anonima.
setTimeout, al igual que
setInterval, evaluan la expresiones cuando el argumento es un string. o sea, hace exactamente lo mismo como si usaramos
eval para evaluar un string como si fuese expresiones de javascript. sin embargo, en el caso de la funcion es distinto. en este caso lo que realmente estamos haciendo es pasar una funcion como argumento y la funcion
setTimeout simplemente llama a esa funcion.
se dice que
eval es evil, o sea, que es demasiado dañino. honestamente no sabria decirte si se refiere en cuanto a rendimiento o seguridad, pienso que es el primero. si
eval es dañino tambien lo es el argumento de
setTimeout cuando se pasa como string. por otro lado,
eval siempre evalua la expresion en el contexto del objeto
window y lo mismo sucede
setTimeout. lo que quiere decir es que el
scope (un mecanismo que maneja la
visibilidad y vida de las variables) de la expresion a evaluar se ejecuta como si las expresiones aparecieran directamente en el codigo fuente, sin estar dentro de una funcion u objeto.
cuando usamos la funcion anonima, sucede el mismo contexto, lo unico que se crea lo que se conoce como
closure. mas o menos lo que significa es "atrapar la visiblidad de las variables de una funcion" con el proposito de poder utilizarlas aunque la funcion no se utilice en el mismo contexto donde esta definida dicha funcion. en tu caso no se refleja este efecto por lo que de momento no tienes que darle tanta importancia a este detalle. para futura refencia te recomiendo que busques por google por los terminos "javascript funcion closure".