Eu tenho algum código que eu absolutamente devo implementar usando goto
. Por exemplo, eu quero escrever um programa como este:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
Existe uma maneira de fazer isso em Javascript?
javascript
goto
Peter Olson
fonte
fonte
Respostas:
Absolutamente! Existe um projeto chamado Summer of Goto que permite que você use JavaScript em todo o seu potencial e revolucionará a maneira como você pode escrever seu código.
Essa ferramenta de pré-processamento JavaScript permite criar um rótulo e, em seguida, saltar usando esta sintaxe:
Por exemplo, o exemplo na pergunta pode ser escrito da seguinte maneira:
Observe que você não se limita apenas a programas triviais simples como um
LATHER
RINSE
ciclo de repetição sem fim - as possibilidades oferecidasgoto
são infinitas e você pode atéHello, world!
enviar uma mensagem para o console do JavaScript 538 vezes, assim:Você pode ler mais sobre como o goto é implementado , mas basicamente ele realiza algum pré-processamento de JavaScript que aproveita o fato de que você pode simular um goto com um loop rotulado
while
. Então, quando você escreve o "Olá, mundo!" programa acima, ele é traduzido para algo como isto:Existem algumas limitações nesse processo de pré-processamento, porque os loops while não podem se estender por várias funções ou blocos. Porém, isso não é grande coisa - tenho certeza que os benefícios de poder tirar proveito do
goto
JavaScript vão sobrecarregá-lo.Todo o link acima que leva à biblioteca goto.js está TODO MORTO, aqui estão os links necessários:
goto.js (descompactado) --- parseScripts.js (descompactado)
No Goto.js :
fonte
goto
provavelmente está subutilizado. Isso cria alguns padrões muito bons de manipulação de erros. Caramba, nós usamosswitch
, que estágoto
em tudo, exceto no nome, e ninguém sofre de barriga.Não. Eles não incluíram isso no ECMAScript:
fonte
goto
se encaixaria perfeitamente bem em cocktail de javascript de estúpido "apresenta" :)goto
é uma palavra-chave reservada para uso futuro, no entanto. Podemos apenas esperar :)goto
seria útil quando você deseja retornar de uma função aninhada. Por exemplo, ao usar underscore.js, você fornece uma função anônima ao iterar sobre matrizes. Você não pode retornar de dentro de uma função, por issogoto end;
seria útil.Na verdade, eu vejo que ECMAScript (JavaScript) tem uma instrução goto. No entanto, o JavaScript goto tem dois sabores!
Os dois tipos de JavaScript do goto são chamados de continue e de interrupção. Não há palavras-chave "ir" em JavaScript. O goto é realizado em JavaScript usando as palavras-chave break e continue.
E isso é mais ou menos explicitamente declarado no site da w3schools aqui http://www.w3schools.com/js/js_switch.asp .
Acho que a documentação do rotulado continue e rotulada como um pouco estranhamente expressa.
A diferença entre o rotulado continuar e o rotulado é onde eles podem ser usados. O continuar rotulado só pode ser usado dentro de um loop while. Veja w3schools para mais informações.
===========
Outra abordagem que funcionará é ter uma declaração while gigante com uma declaração switch gigante dentro:
fonte
break
e tambémcontinue
pode ser usado emfor
loops. Mas eles realmente não são equivalentes aogoto
fato de estarem bloqueados na estrutura do (s) loop (s) relacionado (s), em comparação com ogoto
que pode, é claro - nas linguagens que o possui - ir para qualquer lugar.No JavaScript clássico, você precisa usar loops do-while para obter esse tipo de código. Presumo que talvez você esteja gerando código para outra coisa.
A maneira de fazer isso, como no back-end do bytecode para JavaScript, é agrupar todos os destinos de rótulo em um tempo rotulado "rotulado".
Todo loop do-while rotulado que você usa dessa maneira cria os dois pontos de rótulo para um rótulo. Um na parte superior e outro no final do loop. Pular para trás usa continuar e pular para frente usa pausa.
Infelizmente, não há outra maneira de fazê-lo.
Código de exemplo normal:
Por exemplo, digamos que o código seja codificado para bytecodes, agora você deve colocar os bytecodes em JavaScript para simular seu back-end para algum propósito.
Estilo JavaScript:
Portanto, o uso dessa técnica faz o trabalho bem para propósitos simples. Fora isso, não muito mais você pode fazer.
Para Javacript normal, você não precisa mais usar goto, portanto provavelmente deve evitar essa técnica aqui, a menos que esteja traduzindo especificamente outro código de estilo para executar em JavaScript. Suponho que é assim que eles conseguem o kernel do Linux inicializar em JavaScript, por exemplo.
NOTA! Esta é toda uma explicação ingênua. Para o back-end Js adequado dos bytecodes, considere também examinar os loops antes de emitir o código. Muitos loops while simples podem ser detectados como tal e você pode usar loops em vez de ir para o goto.
fonte
continue
em umdo ... while
loop continua para a condição de verificação . O inversogoto
aqui usando,do ... while (0)
portanto, não funciona. ecma-international.org/ecma-262/5.1/#sec-12.6.1let doLoop
isso funcionar. E loop principal:let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/…Essa é uma pergunta antiga, mas como o JavaScript é um alvo em movimento - é possível no ES6 na implementação que suporte chamadas de cauda adequadas. Nas implementações com suporte para chamadas finais apropriadas, você pode ter um número ilimitado de chamadas finais ativas (ou seja, chamadas finais não "aumentam a pilha").
A
goto
pode ser considerado como uma chamada de cauda sem parâmetros.O exemplo:
pode ser escrito como
Aqui a chamada para
start
está na posição final, portanto não haverá estouros de pilha.Aqui está um exemplo mais complexo:
Primeiro, dividimos a fonte em blocos. Cada etiqueta indica o início de um novo bloco.
Precisamos amarrar os blocos usando gotos. No exemplo, o bloco E segue D, então adicionamos um
goto label3
depois de D.Agora, cada bloco se torna uma função e cada goto se torna uma chamada final.
Para iniciar o programa, use
label1()
.A reescrita é puramente mecânica e, portanto, pode ser feita com um sistema macro como o sweet.js, se necessário.
fonte
fonte
Que tal um
for
loop? Repita quantas vezes quiser. Ou umwhile
loop, repita até que uma condição seja atendida. Existem estruturas de controle que permitem repetir o código. Lembro-meGOTO
no Basic ... fez um código tão ruim! As linguagens de programação modernas oferecem melhores opções que você pode realmente manter.fonte
Existe uma maneira de fazer isso, mas ele precisa ser planejado com cuidado. Tomemos, por exemplo, o seguinte programa QBASIC:
Em seguida, crie seu JavaScript para inicializar todas as variáveis primeiro, seguido de uma chamada de função inicial para iniciar a bola rolando (executamos essa chamada de função inicial no final) e configure funções para cada conjunto de linhas que você sabe que serão executadas a uma unidade.
Siga isto com a chamada de função inicial ...
O resultado nesta instância é:
fonte
Geralmente, eu preferiria não usar o GoTo para facilitar a leitura. Para mim, é uma desculpa ruim para programar funções iterativas simples em vez de ter que programar funções recursivas, ou melhor ainda (se houver medo de coisas como um Stack Overflow), suas verdadeiras alternativas iterativas (que às vezes podem ser complexas).
Algo assim faria:
Isso mesmo, há um loop infinito. A expressão ("true") dentro dos parênteses da cláusula while é o que o mecanismo Javascript verificará - e se a expressão for verdadeira, manterá o loop em execução. Escrever "true" aqui sempre é avaliado como true, portanto, um loop infinito.
fonte
Claro, usando a
switch
construção, você pode simulargoto
em JavaScript. Infelizmente, o idioma não fornecegoto
, mas isso é uma substituição suficiente.fonte
Você provavelmente deve ler alguns tutoriais JS como este um .
Não tenho certeza se
goto
existe em JS, mas, de qualquer forma, ele incentiva um estilo de codificação ruim e deve ser evitado.Você poderia fazer:
fonte
Você pode simplesmente usar uma função:
fonte
Para obter funcionalidades semelhantes a goto, mantendo a pilha de chamadas limpa, estou usando este método:
Observe que esse código é lento, pois as chamadas de função são adicionadas à fila de tempos limite, que é avaliada posteriormente, no loop de atualização do navegador.
Observe também que você pode passar argumentos (usando
setTimeout(func, 0, arg1, args...)
no navegador mais recente que o IE9 ousetTimeout(function(){func(arg1, args...)}, 0)
em navegadores mais antigos.AFAIK, você nunca deve encontrar um caso que exija esse método, a menos que seja necessário pausar um loop não paralelo em um ambiente sem suporte a assíncrono / espera.
fonte
ir para o início e fim de todos os fechamentos dos pais
fonte
fonte
Outra maneira alternativa de conseguir o mesmo é usar as chamadas de cauda. Mas, não temos nada parecido em JavaScript. Geralmente, o goto é realizado em JS usando as duas palavras-chave abaixo. quebrar e continuar , referência: Goto Statement in JavaScript
Aqui está um exemplo:
fonte