2012-02-08 8 views
5

Uno de mis amigos está enseñando una clase de programación con Javascript y una de sus tareas fue crear un juego de adivinar números. Esta fue su ejemplo de implementación:¿La palabra clave break en Javascript solo está pensada para salir de los bucles?

funProgram: for(;;) { 
    numberGuesser: { 
    var num = (Math.random() * 100) | 0; 
    var guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", 0); 
    var guesses = 1; 
    guess: for(;;) { 
     higher: { 
     lower: { 
      if(guess === num) break guess; 
      if(guess > num) break lower; 
      guess = +prompt("Too low. Try again.", 0); 
      break higher; 
     } 
     guess = +prompt("Too high. Try again.", 0); 
     } 
     guesses++; 
    } 
    alert("You got it in " + guesses + " guesses! The number is " + num); 
    } 
    var again = prompt("Do you want to guess again (y/n)?", "y") === "y"; 
    if(!again) break funProgram; 
} 

Me dijo que es una buena práctica para etiquetar su código y se envuelve alrededor de los bloques para que pueda ver fácilmente lo que cada sección está haciendo. También dijo que los descansos etiquetados y continuados son mucho más fáciles de leer que los que no están etiquetados porque puedes saber exactamente de qué estás saliendo. Nunca he visto patrones de código como este, así que no estoy seguro de si esto es cierto.

He estado usando Javascript por un tiempo y hay algunas cosas aquí que nunca he visto antes y algunas cosas que todavía no entiendo. Pensé que la palabra clave break estaba específicamente pensada para salir de los bucles. Los bloques higher y lower no son bucles, pero aparentemente todavía puede salir de él. ¿Cómo es eso posible? Me parece extraño salir de algo que no funciona. ¿También puede salir de funciones usando la palabra clave break?

Respuesta

3

Se rompe can in fact have labels (y acéptelo). Sin embargo, no estoy seguro de quién es "Él", pero llegaría a decir que "Él" está transmitiendo sus ideales de programación, en lugar de un estándar específico. Es decir, no es necesario usar etiquetas, solo hace que sea más legible para esa persona en particular. (Y, en mi humilde opinión, las etiquetas son una reminiscencia de los días BASIC/GOTO que generalmente resulta en Spaghetti Code).

Crédito adicional: Pregunta a tu amigo si solía escribir en BASIC; Apuesto a que obtendrás un "sí" (junto con muchos malos hábitos durante la duración del curso, eso no es un perfil, nunca he tenido una buena experiencia con los programadores de BASIC/VB siguiendo [actual ] patrones

El comando break se usa comúnmente para salir de los bucles, sin embargo, si el bloque de códigos está anidado dentro de una etiqueta, está estableciendo otro bloque más del cual puede deshacerse. También le da un poco más de flexibilidad en cuanto a dónde está previsto que salga el descanso. Por ejemplo:

for (;;){ // "for a" 
    for(;;){ // "for b" 
    break; // breaks "for b" 
    } 
} 

En este caso, break sólo está pensada para salir del bucle anidado ("para b"). Sin embargo:

myblock: { 
    for(;;){ 
    for(;;){ 
     break mybock; // breaks label "myblock" 
    } 
    } 
} 

En este caso, ruptura es en realidad saliendo de ambos bucles porque estás dándole instrucciones para salir del bloque de la etiqueta en su totalidad.Esto sería casi como tener:

function myblock(){ 
    for(;;){ 
    for(;;){ 
     return; // exits function "myblock" 
    } 
    } 
} 

Dónde return sale del bloque similar a la forma break myblock actos.


Por cierto, no es por nada, me parece un poco más fácil de leer:

var again = true; 
while (again){ 
    var num = (new Date()).getMilliseconds() % 100, 
     guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", "1"), 
     guesses = 1; 
    while (num !== guess){ 
     guesses++; 
     guess = +prompt((guess < num ? "Too low." : "Too high.") + " Try again.", guess); 
    } 
    alert("You got it in " + guesses + " guesses! The number is " + num); 
    again = prompt("Do you want to guess again? (y/n)", "y") == "y"; 
} 
+0

+1. Yo sería el que está en la valla opuesta de ... "Él". Yo diría que etiquetar todos los saltos "estándar" hará que el código * sea menos legible, porque la falta de "uso cotidiano" de la etiqueta hace que se destaque como "esto es diferente del 'salto' estándar", lo que significa que ' Pasaré tiempo asegurándome de que este 'break' sí funcione exactamente como lo haría sin la etiqueta. – JimmiTh

0

From MDN (mina negrita énfasis):

La declaración break incluye una etiqueta opcional que permite que el programa para salir de una declaración de la etiqueta. La instrucción break debe ser anidada dentro de esta instrucción etiquetada. La instrucción etiquetada puede ser cualquier declaración block; no tiene que ir precedido de una instrucción de bucle .

Así que, sí, las etiquetas se pueden usar fuera de los bucles, pero no, no se pueden usar para regresar de una función.

0

Los break declaraciones se utilizan de la misma manera que goto se utiliza en las lenguas de mayor edad. Y como Shark señaló: también puede usarlos en declaraciones de cambio, pero no en funciones.

Probablemente sea confuso para usted porque está utilizando los bloques etiquetados junto con los bucles infinitos for(;;).

vistazo a este artículo aquí para más información: http://james.padolsey.com/javascript/labelled-blocks-useful/

1

que puede entender el código después de una pequeña investigación sobre label y break en javascript. Sin embargo, personalmente no me gusta ese estilo de codificación, principalmente porque la sintaxis block etiquetada es muy similar a la notación de objeto literal, que uso mucho. E incluso la documentación de Mozilla en las etiquetas nos dice que los evitemos:

Las etiquetas no son muy comunes en JavaScript, ya que hacen que los programas sean más difíciles de leer y entender. En la medida de lo posible, evite usar etiquetas y, según los casos, prefiera llamar funciones o lanzar un error.

En cuanto a sus preguntas objetivas:

  1. break se puede utilizar para salir for bucles, bucles y whilecase declaraciones, así como la etiqueta blocks.

  2. No puede usar break para salir de una función, debe usar return.

Cuestiones relacionadas