Comment puis-je utiliser goto en Javascript?
J'ai un code que je dois absolument mettre en œuvre à l'aide de goto
. Par exemple, je veux écrire un programme comme ceci:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
Est-il un moyen de le faire en Javascript?
Vous devez vous connecter pour publier un commentaire.
Absolument! Il existe un projet L'é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:
Par exemple, l'exemple de la question peut être écrit comme suit:
Notez que vous ne sont pas seulement limitée à la simple programmes comme un infini
LATHER
RINSE
répétition du cycle—les possibilités offertes par lesgoto
sont infinies et vous pouvez même faire uneHello, world!
message à la console JavaScript 538 fois, comme ceci: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
de la boucle. Donc, quand vous écrivez "Hello, world!" programme ci-dessus, il est traduit à quelque chose comme ceci: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
goto
en JavaScript sera absolument vous accabler.Tout lien ci-dessus qui conduisent à goto.js la bibliothèque est TOUS MORTS, voici les liens nécessaires:
goto.js (non compressé) --- parseScripts.js (non compressé)
De Goto.js:
goto
est probablement sous-utilisé. Elle est pour certains très joli message d'erreur de manipulation de modèles. Heck, nous utilisonsswitch
, qui estgoto
de nom, et personne d'un ventre, des douleurs.Pas. Ils ne comprennent pas que dans ECMAScript:
goto
cadrerait parfaitement bien en javascript cocktail de stupide "caractéristiques" 🙂goto
est un mot clé réservé pour une utilisation future, cependant. Nous ne pouvons qu'espérer 🙂goto
serait utile lorsque vous voulez retourner à partir d'une fonction imbriquée. Par exemple, lors de l'utilisation de underscore.js vous fournir une fonction anonyme lors de l'itération sur des tableaux. Vous ne pouvez pas retourner à partir de l'intérieur d'une telle fonction, de sortegoto end;
serait utile.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 de 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 de travail est de disposer d'un géant de l'instruction while avec un géant de l'instruction switch à l'intérieur:
break
etcontinue
peut être utilisé dansfor
les boucles de trop. Mais ils sont vraiment pas équivalent àgoto
étant donné qu'ils sont enfermés dans la structure de la boucle(s), par rapport àgoto
qui peut bien sûr - dans les langues qui ont il - aller n'importe où.Classique JavaScript, vous devez utiliser, tandis que les boucles pour obtenir ce type de code. Je présume que vous êtes peut-être de la génération de code pour quelque chose d'autre.
La façon de le faire, comme pour backending bytecode de JavaScript est d'envelopper chaque étiquette cible dans un "labellisés"-tandis que.
Chaque étiqueté-lors de la boucle que vous utilisez comme ceci crée en fait deux points d'étiquette pour une étiquette. L'un en haut et un à la fin de la boucle. Sauter en arrière utilise continuer et de sauter transmet utilise pause.
Malheureusement, il n'existe pas d'autre moyen de le faire.
Normal Exemple De Code:
Donc dire que le code est codé pour bytecode alors maintenant, vous devez placer le bytecode en JavaScript pour simuler votre backend pour un certain but.
De style JavaScript:
Donc, en utilisant cette technique fait le travail d'amende pour de simples fins. Autres que que pas beaucoup de choses que vous pouvez faire.
Normal Javacript vous ne devez pas utiliser goto jamais, de sorte que vous devriez éviter cette technique ici, sauf si vous êtes spécialement traduire d'autres style de l'exécution de code JavaScript. Je suppose que c'est la façon dont ils obtiennent le noyau Linux pour démarrer en JavaScript par exemple.
REMARQUE! C'est tous les naïfs explication. Pour une bonne Js backend de bytecode d'examiner aussi les boucles avant de sortir le code. Beaucoup de simples tandis que les boucles peuvent être détectées comme telles et vous pouvez plutôt utiliser des boucles au lieu de goto.
continue
dans undo ... while
boucle continue pour la vérification de l'état. L'arrièregoto
ici à l'aide dedo ... while (0)
donc ne fonctionne pas. ecma-international.org/ecma-262/5.1/#sec-12.6.1let doLoop
pour que cela fonctionne. Et la boucle principale:let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/...C'est une vieille question, mais le JavaScript est une cible en mouvement - il est possible dans l'ES6 sur la mise en œuvre qui prennent en charge la bonne queue d'appels. Des mises en oeuvre avec le soutien de la bonne queue d'appels, vous pouvez avoir un nombre illimité de active queue appels (c'est à dire de la queue des appels n'est pas "augmenter la pile").
Un
goto
peut être considéré comme une queue d'appel sans paramètres.L'exemple:
peut être écrite comme
Ici l'appel à
start
est dans la queue de position, donc il n'y aura pas de débordements de pile.Voici un exemple plus complexe:
Tout d'abord, nous nous sommes séparés de la source dans les blocs. Chaque étiquette indique le début d'un nouveau bloc.
Nous avons besoin de lier les blocs ensemble à l'aide de gotos.
Dans l'exemple, le bloc E suit D, alors nous ajoutons une
goto label3
après D.Maintenant chaque bloc devient une fonction et chaque goto devient une queue appel.
Pour démarrer le programme, utilisez
label1()
.La réécriture est purement mécanique et peut donc être faite avec un système de macro comme sweet.js en cas de besoin.
Un
for
boucle? Répétez autant de fois que vous le souhaitez. Ou unwhile
boucle, répéter jusqu'à ce qu'une condition est remplie. Il y a des structures de contrôle qui vous permettra de répéter le code. Je me souviensGOTO
de Base... il fait si mauvais code! Langages de programmation modernes vous donner de meilleures options que vous pouvez réellement maintenir.Il existe un moyen de cela peut être fait, mais il doit être planifié avec soin.
Prenez par exemple le suivant QBASIC programme:
Puis de créer votre JavaScript pour initialiser toutes les variables en premier, suivi par un premier appel de fonction pour démarrer le bal (nous exécutons ce premier appel de fonction à la fin), et de définir des fonctions pour chaque ensemble de lignes que vous savez être exécuté en une seule unité.
Suivre cela avec l'initiale de l'appel de fonction...
Le résultat dans ce cas est:
En général, je préfère ne pas utiliser GoTo pour les mauvaises raisons de lisibilité. Pour moi, c'est une mauvaise excuse pour une programmation simple itératif fonctions au lieu d'avoir à programmer des fonctions récursives, ou mieux encore (si des choses comme un Débordement de la Pile est à craindre), leur vraie itératif alternatives (qui peut parfois être complexe).
Quelque chose comme cela ferait:
Qu'à droite il y a une boucle infinie. L'expression ("true") à l'intérieur de la parenthèse de l'tandis que la clause est ce que le moteur Javascript vérifie - et si l'expression est vraie, il va garder la boucle en cours d'exécution. L'écriture de "vrai" ici renvoie toujours true, donc une boucle infinie.
Assurer, à l'aide de la
switch
construire, vous pouvez simulergoto
en JavaScript. Malheureusement, la langue n'a pas de fournirgoto
, mais c'est un assez bon d'un remplacement.Vous devriez lire quelques JS tutoriels comme ce un.
Ne sais pas si
goto
existe en JS, mais, de toute façon, il encourage les mauvais style de codage et doit être évitée.Que vous pouvez faire:
Vous pouvez simplement utiliser une fonction:
Pour atteindre goto fonctionnalités tout en gardant la pile d'appel propre, je suis en utilisant cette méthode:
Veuillez noter que ce code est lente car les appels de fonction sont ajoutés aux délais d'attente file d'attente, qui est évaluée à plus tard, dans le navigateur de mise à jour de boucle.
Veuillez également noter que vous pouvez passer des arguments (à l'aide de
setTimeout(func, 0, arg1, args...)
dans le navigateur plus récent que IE9, ousetTimeout(function(){func(arg1, args...)}, 0)
dans les navigateurs plus anciens.Autant que je sache, vous ne devriez jamais couru dans une affaire qui exige cette méthode, sauf si vous avez besoin de mettre en pause un non-parallelable boucle dans un environnement sans async/await soutien.
goto début et la fin de tous les parents fermetures
Une autre alternative pour obtenir le même est de l'utilisation de la queue des appels. Mais, nous n'avons rien de tel qu'en JavaScript.
Donc, en général, le goto est fait en JS en utilisant les deux mots-clés ci-dessous.
pause et
continuer,
référence: Instruction Goto en JavaScript
Voici un exemple: