Tengo un código que absolutamente debo implementar usando goto
. Por ejemplo, quiero escribir un programa como este:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
¿Hay alguna manera de hacer eso en Javascript?
javascript
goto
Peter Olson
fuente
fuente
Respuestas:
¡Absolutamente! Hay un proyecto llamado Summer of Goto que le permite usar JavaScript en todo su potencial y revolucionará la forma en que puede escribir su código.
Esta herramienta de preprocesamiento de JavaScript le permite crear una etiqueta y luego ir a ella usando esta sintaxis:
Por ejemplo, el ejemplo en la pregunta se puede escribir de la siguiente manera:
Tenga en cuenta que no solo se limita a programas triviales simples como un
LATHER
RINSE
ciclo de repetición sin fin : las posibilidades que ofrecegoto
son infinitas e incluso puede enviar unHello, world!
mensaje a la consola de JavaScript 538 veces, de esta manera:Puede leer más sobre cómo se implementa goto , pero básicamente realiza un preprocesamiento de JavaScript que aprovecha el hecho de que puede simular un goto con un bucle etiquetado
while
. Entonces, cuando escribes el "¡Hola, mundo!" programa anterior, se traduce a algo como esto:Existen algunas limitaciones para este proceso de preprocesamiento, porque los bucles while no pueden extenderse a través de múltiples funciones o bloques. Sin embargo, eso no es un gran problema: estoy seguro de que los beneficios de poder aprovechar
goto
JavaScript lo abrumarán por completo.Todo el enlace anterior que conduce a la biblioteca goto.js está MUERTO, aquí hay enlaces necesarios:
goto.js (sin comprimir) --- parseScripts.js (sin comprimir)
De Goto.js :
fuente
goto
probablemente está subutilizado. Hace algunos patrones de manejo de errores muy agradables. Diablos, usamosswitch
, que estágoto
en todo menos en el nombre, y a nadie le duele el vientre.No. No incluyeron eso en ECMAScript:
fuente
goto
encajaría perfectamente en el cóctel de "características" estúpidas de JavaScript :)goto
Sin embargo, es una palabra clave reservada para uso futuro. Solo podemos esperar :)goto
sería útil cuando desee regresar de una función anidada. Por ejemplo, cuando usa underscore.js, proporciona una función anónima al iterar sobre matrices. No puede regresar desde dentro de una función así, porgoto end;
lo que sería útil.En realidad, veo que ECMAScript (JavaScript) TIENE DE VERDAD una declaración goto. ¡Sin embargo, el goto de JavaScript tiene dos sabores!
Los dos sabores de JavaScript de goto se denominan etiquetado continuar y rotulado rotura. No hay una palabra clave "goto" en JavaScript. El goto se realiza en JavaScript utilizando las palabras clave break y continue.
Y esto se afirma más o menos explícitamente en el sitio web de w3schools aquí http://www.w3schools.com/js/js_switch.asp .
Encuentro la documentación de la etiqueta continuar y rotura rotulada algo torpemente expresada.
La diferencia entre el continuado etiquetado y el descanso rotulado es dónde se pueden usar. La etiqueta continuar solo puede usarse dentro de un ciclo while. Vea w3schools para más información.
===========
Otro enfoque que funcionará es tener una declaración gigante mientras que con una declaración de interruptor gigante dentro:
fuente
break
y tambiéncontinue
puede usarse enfor
bucles. Pero en realidad no son equivalentes,goto
dado que están encerrados en la estructura de los bucles relacionados, en comparación con losgoto
que, por supuesto, pueden ir a cualquier lugar, en los idiomas que lo tienen.En JavaScript clásico, debe usar bucles do-while para lograr este tipo de código. Supongo que tal vez estás generando código para otra cosa.
La forma de hacerlo, como para el código de bytes de backending a JavaScript, es envolver cada objetivo de etiqueta en un tiempo "etiquetado".
Cada bucle do-while etiquetado que usa de esta manera crea los dos puntos de etiqueta para una etiqueta. Uno en la parte superior y otro al final del bucle. Saltar hacia atrás usa continuar y saltar hacia adelante usa descanso.
Lamentablemente, no hay otra forma de hacerlo.
Código de ejemplo normal:
Digamos que el código se codifica en bytecodes, por lo que ahora debe poner los bytecodes en JavaScript para simular su backend para algún propósito.
Estilo JavaScript:
Por lo tanto, usar esta técnica hace el trabajo bien para propósitos simples. Aparte de eso, no hay mucho más que puedas hacer.
Para Javacript normal, no debería necesitar usar goto nunca, por lo que probablemente debería evitar esta técnica aquí a menos que esté traduciendo específicamente otro código de estilo para ejecutar en JavaScript. Supongo que así es como hacen que el kernel de Linux arranque en JavaScript, por ejemplo.
¡NOTA! Esta es toda una explicación ingenua. Para el backend Js apropiado de los códigos de bytes, también considere examinar los bucles antes de generar el código. Muchos bucles while simples se pueden detectar como tales y luego puede usar bucles en lugar de ir a.
fuente
continue
en undo ... while
bucle continúa a la condición de verificación . El uso al revésgoto
aquí, por lodo ... while (0)
tanto, no funciona. ecma-international.org/ecma-262/5.1/#sec-12.6.1let doLoop
para que esto funcione. Y bucle principal:let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/…Esta es una pregunta antigua, pero dado que JavaScript es un objetivo móvil, es posible en ES6 en la implementación que admita llamadas de cola adecuadas. En implementaciones con soporte para llamadas de cola adecuadas, puede tener un número ilimitado de llamadas de cola activas (es decir, las llamadas de cola no "hacen crecer la pila").
UNA
goto
puede considerarse como una llamada de cola sin parámetros.El ejemplo:
Se puede escribir como
Aquí la llamada a
start
está en posición de cola, por lo que no habrá desbordamientos de pila.Aquí hay un ejemplo más complejo:
Primero, dividimos la fuente en bloques. Cada etiqueta indica el inicio de un nuevo bloque.
Necesitamos unir los bloques usando gotos. En el ejemplo, el bloque E sigue a D, entonces agregamos un
goto label3
después de D.Ahora cada bloque se convierte en una función y cada goto se convierte en una cola.
Para iniciar el programa, use
label1()
.La reescritura es puramente mecánica y, por lo tanto, se puede hacer con un sistema macro como sweet.js si es necesario.
fuente
fuente
¿Qué tal un
for
bucle? Repite tantas veces como quieras. O unwhile
bucle, repita hasta que se cumpla una condición. Hay estructuras de control que le permitirán repetir el código. RecuerdoGOTO
en Basic ... ¡hizo un código tan malo! Los lenguajes de programación modernos le ofrecen mejores opciones que realmente puede mantener.fuente
Hay una manera de hacerlo, pero debe planificarse con cuidado. Tomemos, por ejemplo, el siguiente programa QBASIC:
Luego cree su JavaScript para inicializar todas las variables primero, seguido de una llamada de función inicial para comenzar a rodar la bola (ejecutamos esta llamada de función inicial al final), y configure funciones para cada conjunto de líneas que sabe que se ejecutarán en La unidad.
Siga esto con la llamada de función inicial ...
El resultado en esta instancia es:
fuente
En general, preferiría no usar GoTo por mala legibilidad. Para mí, es una mala excusa para programar funciones iterativas simples en lugar de tener que programar funciones recursivas, o incluso mejor (si se teme un desbordamiento de pila), sus verdaderas alternativas iterativas (que a veces pueden ser complejas).
Algo como esto haría:
Que justo allí hay un bucle infinito. La expresión ("verdadero") dentro de las paréntesis de la cláusula while es lo que verificará el motor Javascript, y si la expresión es verdadera, mantendrá el ciclo en ejecución. Escribir "verdadero" aquí siempre se evalúa como verdadero, por lo tanto, un bucle infinito.
fuente
Claro, usando la
switch
construcción puedes simulargoto
en JavaScript. Desafortunadamente, el idioma no proporcionagoto
, pero este es un reemplazo lo suficientemente bueno.fuente
Probablemente debería leer algunos tutoriales JS como este uno .
No estoy seguro si
goto
existe en JS, pero, de cualquier manera, alienta un estilo de codificación incorrecto y debe evitarse.Podrías hacerlo:
fuente
Simplemente puede usar una función:
fuente
Para lograr una funcionalidad similar a goto mientras se mantiene limpia la pila de llamadas, estoy usando este método:
Tenga en cuenta que este código es lento ya que las llamadas de función se agregan a la cola de tiempos de espera, que se evalúa más adelante, en el ciclo de actualización del navegador.
Tenga en cuenta también que puede pasar argumentos (utilizando un
setTimeout(func, 0, arg1, args...)
navegador más nuevo que IE9, osetTimeout(function(){func(arg1, args...)}, 0)
en navegadores más antiguos.AFAIK, nunca debería toparse con un caso que requiera este método a menos que necesite pausar un bucle no paralelo en un entorno sin soporte asíncrono / en espera.
fuente
ir al principio y al final de todos los cierres de padres
fuente
fuente
Otra forma alternativa de lograr lo mismo es utilizar las llamadas de cola. Pero no tenemos nada de eso en JavaScript. Entonces, generalmente, el goto se logra en JS usando las dos palabras clave a continuación. romper y continuar , referencia: Ir a la declaración en JavaScript
Aquí hay un ejemplo:
fuente