141 votes

Comment utiliser goto en Javascript?

J'ai du code que je dois absolument implémenter en utilisant goto . Par exemple, je veux écrire un programme comme celui-ci:

 start:
alert("RINSE");
alert("LATHER");
repeat: goto start
 

Y a-t-il un moyen de faire cela en Javascript?

165voto

Peter Olson Points 30452

Absolument! Il existe un projet d'Été de Goto qui permet l'utilisation de Javascript à son plein potentiel et va révolutionner la façon dont vous pouvez écrire votre code.

Ce Javascript prétraitement outil vous permet de créer une étiquette, puis goto à l'aide de cette syntaxe:

[lbl] <label-name>
goto <label-name>

Par exemple, l'exemple de la question peut être écrit comme suit:

[lbl] start:
alert("LATHER");
alert("RINSE");
[lbl] repeat: goto start;

Vous pouvez voir cet exemple en action sur jsFiddle, mais sachez que ce sera une boucle infinie et vous pourriez avoir à forcer l'arrêt de votre navigateur pour en sortir.

Notez que vous ne sont pas seulement limitée à la simple programmes comme une interminable LATHER RINSE répétition du cycle--les possibilités offertes par l' goto sont infinies et vous pouvez même faire une Hello, world! message à la console Javascript 538 fois, comme ceci:

var i = 0;
[lbl] start:
console.log("Hello, world!");
i++;
if(i < 538) goto start;

Encore une fois, vous pouvez le voir en action sur jsFiddle, et cette fois, vous n'avez pas à vous soucier d'avoir à la fin le programme de force.

Vous pouvez lire plus sur comment goto est mis en œuvre, mais, fondamentalement, il fait un peu de Javascript prétraitement qui tire profit du fait que vous pouvez simuler un goto avec un étiquetés while boucle. Donc, quand vous écrivez "Hello, world!" programme ci-dessus, il est traduit à quelque chose comme ceci:

var i = 0;
start: while(true) {
  console.log("Hello, world!");
  i++;
  if(i < 538) continue start;
  break;
}

Il y a certaines limites à ce processus de prétraitement, parce que tandis que les boucles ne peuvent pas s'étendent à travers de multiples fonctions ou des blocs. Ce n'est pas une grosse affaire, mais-je suis sûr que les avantages d'être en mesure de prendre avantage de l' goto en Javascript sera absolument vous accabler.

132voto

pimvdb Points 66332

Non, ils ne l'incluaient pas dans ECMAScript:

ECMAScript n'a pas de déclaration goto.

32voto

Indinfer Points 349

En fait, je vois que ECMAScript (JavaScript) N'ont, en EFFET, une instruction goto. Cependant, le JavaScript goto a deux saveurs!

Les deux JavaScript saveurs de goto sont appelés marqué continuer et étiquetés pause. Il n'y a pas de mot-clé "goto" en JavaScript. Le goto est réalisée en JavaScript à l'aide de la pause et de continuer de mots clés.

Et c'est plus ou moins explicitement sur le site w3schools ici http://www.w3schools.com/js/js_switch.asp.

- Je trouver la documentation de la étiquetés continuer et étiquetés casser un peu maladroitement exprimé.

La différence entre la borne continuer et marqué de pause où ils peuvent être utilisés. L'étiquette de poursuivre ne peut être utilisé à l'intérieur d'une boucle while. Voir w3schools pour plus d'information.

===========

Une autre approche serait d'avoir un géant de l'instruction while avec un géant de l'instruction switch à l'intérieur:

while (true)
{
    switch (goto_variable)
    {
        case 1:
            // some code
            goto_variable = 2
            break;
        case 2:
            goto_variable = 5   // case in etc. below
            break;
        case 3:
            goto_variable = 1
            break;

         etc. ...
    }

}

15voto

Henri Gourvest Points 737
const
    start = 0,
    more = 1,
    pass = 2,
    loop = 3,
    skip = 4,
    done = 5;

var label = start;


while (true){
    var goto = null;
    switch (label){
        case start:
            console.log('start');
        case more:
            console.log('more');
        case pass:
            console.log('pass');
        case loop:
            console.log('loop');
            goto = pass; break;
        case skip:
            console.log('skip');
        case done:
            console.log('done');

    }
    if (goto == null) break;
    label = goto;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X