У меня есть код, который я обязательно должен реализовать goto
. Например, я хочу написать такую программу:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
Есть ли способ сделать это в Javascript?
javascript
goto
Питер Олсон
источник
источник
Ответы:
Абсолютно! Существует проект под названием Summer of Goto, который позволяет вам использовать JavaScript в полном объеме и революционизирует способ написания кода.
Этот инструмент предварительной обработки JavaScript позволяет вам создать метку, а затем перейти к ней, используя следующий синтаксис:
Например, пример в вопросе можно записать так:
Обратите внимание, что вы не ограничены только простыми тривиальными программами, такими как бесконечный
LATHER
RINSE
цикл повторения - возможности, предоставляемые имиgoto
, безграничны, и вы даже можете отправитьHello, world!
сообщение в консоль JavaScript 538 раз, например:Вы можете узнать больше о том, как реализован goto , но в основном он выполняет некоторую предварительную обработку JavaScript, которая использует тот факт, что вы можете имитировать goto с помеченным
while
циклом . Итак, когда вы пишете «Привет, мир!» приведенной выше программе, она переводится примерно так:У этого процесса предварительной обработки есть некоторые ограничения, поскольку циклы while не могут распространяться на несколько функций или блоков. Однако это не имеет большого значения - я уверен, что преимущества использования
goto
JavaScript в полной мере поразят вас.Все приведенные выше ссылки, ведущие к библиотеке goto.js, ВСЕ МЕРТВы, здесь необходимы ссылки:
goto.js (без сжатия) --- parseScripts.js (без сжатия)
Из Goto.js :
источник
goto
используется недостаточно. Это создает очень хорошие шаблоны обработки ошибок. Черт возьми, мы употребляемswitch
, чтоgoto
во всем, кроме названия, и ни у кого не болит живот.Нет. Они не включили это в ECMAScript:
источник
goto
отлично вписалось бы в коктейль дурацких «фич» javascript :)goto
однако это зарезервированное ключевое слово для использования в будущем. Нам остается только надеяться :)goto
было бы полезно, когда вы хотите вернуться из вложенной функции. Например, при использовании underscore.js вы предоставляете анонимную функцию при переборе массивов. Вы не можете вернуться изнутри такой функции, поэтомуgoto end;
было бы полезно.На самом деле, я вижу, что в ECMAScript (JavaScript) ДЕЙСТВИТЕЛЬНО есть инструкция goto. Однако у JavaScript goto есть две разновидности!
Две разновидности goto в JavaScript называются «continue» и «break». В JavaScript нет ключевого слова "goto". Переход выполняется в JavaScript с использованием ключевых слов break и continue.
И это более или менее четко указано на сайте w3schools здесь http://www.w3schools.com/js/js_switch.asp .
Я нахожу документацию помеченного продолжения и помеченного перерыва несколько неуклюже выраженной.
Разница между помеченным продолжением и помеченным разрывом заключается в том, где они могут использоваться. Отмеченное continue можно использовать только внутри цикла while. См. Дополнительную информацию на w3schools.
===========
Другой подход, который будет работать, - иметь гигантский оператор while с гигантским оператором switch внутри:
источник
break
иcontinue
может использоваться вfor
петлях. Но на самом деле они не эквивалентны тому,goto
что они заблокированы в структуре связанных циклов, по сравнению сgoto
которыми, конечно, на языках, в которых они есть, могут перемещаться куда угодно.В классическом JavaScript вам нужно использовать циклы do-while для достижения этого типа кода. Я предполагаю, что вы, возможно, генерируете код для чего-то другого.
Способ сделать это, как и для байт-кода в JavaScript, состоит в том, чтобы обернуть каждую цель метки в «помеченный» do-while.
Каждый помеченный цикл do-while, который вы используете таким образом, фактически создает две точки метки для одной метки. Один вверху и один в конце петли. Для прыжка назад используется continue, а для прыжка вперед - break.
К сожалению, другого выхода нет.
Нормальный пример кода:
Скажем, код кодируется в байт-коды, поэтому теперь вы должны поместить байт-коды в JavaScript, чтобы с какой-то цели имитировать свой бэкэнд.
Стиль JavaScript:
Так что использование этой техники отлично подходит для простых целей. Кроме этого, вы больше ничего не можете сделать.
Для обычного Javacript вам никогда не нужно использовать goto, поэтому вам, вероятно, следует избегать этого метода здесь, если вы специально не переводите код другого стиля для работы на JavaScript. Я предполагаю, что именно так они заставляют ядро Linux загружаться, например, в JavaScript.
НОТА! Все это наивное объяснение. Для правильной обработки байт-кодов Js также рассмотрите возможность проверки циклов перед выводом кода. Многие простые циклы while могут быть обнаружены как таковые, и тогда вы можете использовать циклы вместо goto.
источник
continue
вdo ... while
цикле переходит к условию проверки . Обратноеgoto
здесь, используяdo ... while (0)
не работает. ecma-international.org/ecma-262/5.1/#sec-12.6.1let doLoop
это сработало. И основной цикл:let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/…Это старый вопрос, но поскольку JavaScript - это движущаяся цель, в ES6 это возможно при реализации, которая поддерживает правильные хвостовые вызовы. В реализациях с поддержкой правильных хвостовых вызовов вы можете иметь неограниченное количество активных хвостовых вызовов (т.е. хвостовые вызовы не «увеличивают стек»).
A
goto
можно рассматривать как хвостовой вызов без параметров.Пример:
можно записать как
Здесь вызов
start
находится в хвостовой позиции, поэтому переполнения стека не будет.Вот более сложный пример:
Сначала мы разбиваем источник на блоки. Каждая метка указывает начало нового блока.
Нам нужно связать блоки вместе с помощью gotos. В этом примере блок E следует за D, поэтому мы добавляем a
goto label3
после D.Теперь каждый блок становится функцией, а каждый переход становится хвостовым вызовом.
Для запуска программы используйте
label1()
.Перезапись является чисто механической и, таким образом, при необходимости может быть выполнена с помощью макросистемы, такой как sweet.js.
источник
источник
Как насчет
for
петли? Повторите столько раз, сколько захотите. Илиwhile
цикл, повторяемый до тех пор, пока не будет выполнено условие. Есть управляющие структуры, которые позволят вам повторять код. Я помню,GOTO
в Basic ... он сделал такой плохой код! Современные языки программирования предоставляют вам лучшие возможности, которые вы действительно можете поддерживать.источник
Есть способ сделать это, но его нужно тщательно спланировать. Возьмем, к примеру, следующую программу QBASIC:
Затем создайте свой JavaScript, чтобы сначала инициализировать все переменные, а затем выполнить начальный вызов функции, чтобы начать движение (мы выполняем этот начальный вызов функции в конце), и настройте функции для каждого набора строк, которые, как вы знаете, будут выполняться в один блок.
Затем выполните начальный вызов функции ...
Результат в этом случае:
источник
Как правило, я бы предпочел не использовать GoTo из-за плохой читаемости. Для меня это плохой предлог для программирования простых итерационных функций вместо того, чтобы программировать рекурсивные функции или, что еще лучше (если опасаются таких вещей, как переполнение стека), их истинных итерационных альтернатив (которые иногда могут быть сложными).
Что-то вроде этого подойдет:
Вот и есть бесконечный цикл. Выражение («истина») в скобках предложения while - это то, что механизм Javascript будет проверять - и если выражение истинно, он продолжит выполнение цикла. Написание здесь «истина» всегда означает истину, отсюда бесконечный цикл.
источник
Конечно, с помощью
switch
конструкции вы можете моделироватьgoto
на JavaScript. К сожалению, в языке нетgoto
, но это хорошая замена.источник
Вы , вероятно , следует прочитать некоторые JS учебники как этот один .
Не уверен если
goto
существует в JS, но, в любом случае, он поощряет плохой стиль кодирования, и его следует избегать.Вы могли:
источник
Вы можете просто использовать функцию:
источник
Чтобы достичь функциональности, подобной goto, при сохранении чистоты стека вызовов, я использую этот метод:
Обратите внимание, что этот код работает медленно, поскольку вызовы функций добавляются в очередь таймаутов, которая оценивается позже в цикле обновления браузера.
Также обратите внимание, что вы можете передавать аргументы (используя
setTimeout(func, 0, arg1, args...)
в браузере новее, чем IE9, илиsetTimeout(function(){func(arg1, args...)}, 0)
в старых браузерах.AFAIK, вы никогда не должны сталкиваться с делом, требующим этого метода, если вам не нужно приостанавливать непараллельный цикл в среде без поддержки async / await.
источник
goto начало и конец всех родительских закрытий
источник
источник
Другой альтернативный способ добиться того же - использовать хвостовые вызовы. Но в JavaScript ничего подобного нет. Итак, как правило, goto выполняется в JS с использованием следующих двух ключевых слов. прервать и продолжить , ссылка: Оператор Goto в JavaScript
Вот пример:
источник