buenas!!!
no voy a debatir cuál es mejor o cuál es peor... en mi opinión cualquier bucle funciona. a lo que voy, los últimos dos ejemplos están mal; no hay un closure de la variable. es cierto que para el caso particular, console.log imprime el valor correcto. sin embargo, ¿imprimirá el valor correcto más adelante? o sea, si al final invocamos las funciones, cada una imprime el último valor de la variable.
Código:
funcs[0](); // 2
funcs[1](); // 2
funcs[2](); // 2
el único que funciona correctamente es el primer ejemplo de @alexis88.