Saya memiliki beberapa kode yang harus saya terapkan untuk digunakan goto
. Misalnya, saya ingin menulis program seperti ini:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
Apakah ada cara untuk melakukannya di Javascript?
javascript
goto
Peter Olson
sumber
sumber
Jawaban:
Benar! Ada sebuah proyek bernama Summer of Goto yang memungkinkan Anda menggunakan JavaScript pada potensi penuhnya dan akan merevolusi cara Anda dapat menulis kode Anda.
Alat preprocessing JavaScript ini memungkinkan Anda membuat label dan kemudian menggunakannya menggunakan sintaks ini:
Misalnya, contoh dalam pertanyaan dapat ditulis sebagai berikut:
Perhatikan bahwa Anda tidak hanya terbatas pada program sepele yang sederhana seperti
LATHER
RINSE
siklus berulang tanpa akhir — kemungkinan yang diberikangoto
tidak terbatas dan Anda bahkan dapat membuatHello, world!
pesan ke konsol JavaScript 538 kali, seperti ini:Anda dapat membaca lebih lanjut tentang bagaimana goto diimplementasikan , tetapi pada dasarnya, ia melakukan beberapa preprocessing JavaScript yang memanfaatkan fakta bahwa Anda dapat mensimulasikan goto dengan loop berlabel
while
. Jadi, ketika Anda menulis "Halo, dunia!" program di atas, akan diterjemahkan ke sesuatu seperti ini:Ada beberapa batasan untuk proses preprocessing ini, karena sementara loop tidak dapat membentang di beberapa fungsi atau blok. Tapi itu bukan masalah besar — saya yakin manfaat bisa memanfaatkan
goto
JavaScript akan benar-benar membuat Anda kewalahan.Semua tautan di atas yang mengarah ke pustaka goto.js adalah SEMUA MATI, di sini ada tautan yang dibutuhkan:
goto.js (tidak terkompresi) --- parseScripts.js (tidak terkompresi)
Dari Goto.js :
sumber
goto
mungkin kurang dimanfaatkan. Itu membuat beberapa pola penanganan kesalahan yang sangat bagus. Heck, kita gunakanswitch
, yanggoto
semuanya kecuali nama, dan tidak ada yang sakit perut.Tidak. Mereka tidak memasukkannya ke dalam ECMAScript:
sumber
goto
akan cocok dengan koktail javascript dari "fitur" :) :)goto
adalah kata kunci yang dipesan untuk penggunaan di masa mendatang. Kami hanya bisa berharap :)goto
akan berguna saat Anda ingin kembali dari fungsi bersarang. Misalnya, saat menggunakan underscore.js, Anda memberikan fungsi anonim saat iterating over array. Anda tidak dapat kembali dari dalam fungsi seperti itu, jadigoto end;
akan bergunaSebenarnya, saya melihat bahwa ECMAScript (JavaScript) TIDAK MENGGUNAKAN pernyataan goto. Namun, goto JavaScript memiliki dua rasa!
Dua rasa JavaScript dari goto disebut berlabel lanjut dan berlabel istirahat. Tidak ada kata kunci "goto" di JavaScript. Goto diselesaikan dalam JavaScript menggunakan istirahat dan melanjutkan kata kunci.
Dan ini kurang lebih secara eksplisit dinyatakan di situs web w3schools di sini http://www.w3schools.com/js/js_switch.asp .
Saya menemukan dokumentasi dari label berlabel terus dan label agak canggung diekspresikan.
Perbedaan antara terus berlabel dan istirahat berlabel adalah di mana mereka dapat digunakan. Berlanjut berlabel hanya dapat digunakan di dalam loop sementara. Lihat sekolah w3 untuk informasi lebih lanjut.
===========
Pendekatan lain yang akan bekerja adalah memiliki pernyataan sementara raksasa dengan pernyataan beralih raksasa di dalamnya:
sumber
break
dancontinue
dapat digunakan dalamfor
loop juga. Tapi mereka benar-benar tidak setara dengangoto
mengingat bahwa mereka terkunci ke dalam struktur loop terkait, dibandingkan dengangoto
yang tentu saja - dalam bahasa yang memilikinya - pergi ke mana saja.Dalam JavaScript klasik, Anda perlu menggunakan loop do-while untuk mencapai jenis kode ini. Saya kira Anda mungkin menghasilkan kode untuk beberapa hal lain.
Cara untuk melakukannya, seperti mem-backend bytecode ke JavaScript adalah dengan membungkus setiap target label dengan do-while "berlabel".
Setiap loop do-while berlabel yang Anda gunakan seperti ini sebenarnya menciptakan dua titik label untuk satu label. Satu di bagian atas dan satu di ujung lingkaran. Melompat kembali menggunakan terus dan melompat maju menggunakan istirahat.
Sayangnya tidak ada cara lain untuk melakukannya.
Kode Contoh Normal:
Jadi katakanlah kode akan dikodekan ke bytecodes jadi sekarang Anda harus memasukkan bytecode ke dalam JavaScript untuk mensimulasikan backend Anda untuk beberapa tujuan.
Gaya JavaScript:
Jadi menggunakan teknik ini melakukan pekerjaan dengan baik untuk tujuan sederhana. Selain itu tidak banyak lagi yang bisa Anda lakukan.
Untuk Javacript biasa Anda tidak perlu menggunakan goto, jadi Anda mungkin harus menghindari teknik ini di sini kecuali jika Anda secara spesifik menerjemahkan kode gaya lain untuk dijalankan di JavaScript. Saya berasumsi itu adalah bagaimana mereka membuat kernel Linux untuk boot dalam JavaScript misalnya.
CATATAN! Ini semua penjelasan yang naif. Untuk backend Js yang tepat dari bytecodes juga pertimbangkan memeriksa loop sebelum mengeluarkan kode. Banyak loop sederhana sementara dapat dideteksi seperti itu dan kemudian Anda bisa menggunakan loop bukan goto.
sumber
continue
dalam satudo ... while
lingkaran berlanjut ke kondisi pemeriksaan . Mundur digoto
sini menggunakando ... while (0)
demikian tidak bekerja. ecma-international.org/ecma-262/5.1/#sec-12.6.1let doLoop
ini agar berhasil. Dan loop utama:let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/…Ini adalah pertanyaan lama, tetapi karena JavaScript adalah target yang bergerak - dimungkinkan dalam ES6 pada implementasi yang mendukung panggilan ekor yang tepat. Pada implementasi dengan dukungan untuk panggilan ekor yang tepat, Anda dapat memiliki jumlah panggilan ekor aktif yang tidak terbatas (mis. Panggilan ekor tidak "menumbuhkan tumpukan").
SEBUAH
goto
dapat dianggap sebagai panggilan ekor tanpa parameter.Contoh:
dapat ditulis sebagai
Di sini panggilan untuk
start
berada di posisi ekor, sehingga tidak akan ada tumpukan yang meluap.Ini adalah contoh yang lebih kompleks:
Pertama, kami membagi sumber menjadi beberapa blok. Setiap label menunjukkan awal dari blok baru.
Kita perlu mengikat blok bersama-sama menggunakan gotos. Dalam contoh, blok E mengikuti D, jadi kami menambahkan
goto label3
setelah D.Sekarang setiap blok menjadi fungsi dan setiap goto menjadi panggilan ekor.
Untuk memulai program, gunakan
label1()
.Penulisan ulang adalah murni mekanis dan dengan demikian dapat dilakukan dengan sistem makro seperti sweet.js jika perlu.
sumber
sumber
Bagaimana dengan
for
loop? Ulangi sebanyak yang Anda suka. Atau satuwhile
loop, ulangi sampai suatu kondisi terpenuhi. Ada struktur kontrol yang memungkinkan Anda mengulangi kode. Saya ingatGOTO
di Basic ... itu membuat kode yang buruk! Bahasa pemrograman modern memberi Anda pilihan yang lebih baik yang sebenarnya bisa Anda pertahankan.sumber
Ada cara yang bisa dilakukan, tetapi perlu direncanakan dengan hati-hati. Ambil contoh program QBASIC berikut:
Kemudian buat JavaScript Anda untuk menginisialisasi semua variabel terlebih dahulu, diikuti dengan membuat panggilan fungsi awal untuk memulai bola bergulir (kami menjalankan panggilan fungsi awal ini di akhir), dan mengatur fungsi untuk setiap rangkaian garis yang Anda tahu akan dieksekusi di satu unit.
Ikuti ini dengan panggilan fungsi awal ...
Hasilnya dalam hal ini adalah:
sumber
Secara umum, saya lebih suka tidak menggunakan GoTo untuk keterbacaan yang buruk. Bagi saya, itu adalah alasan buruk untuk pemrograman fungsi iteratif sederhana daripada harus memprogram fungsi rekursif, atau bahkan lebih baik (jika hal-hal seperti Stack Overflow ditakuti), alternatif iteratif mereka yang sebenarnya (yang kadang-kadang mungkin rumit).
Sesuatu seperti ini akan dilakukan:
Itu benar ada loop tak terbatas. Ekspresi ("true") di dalam parantheses sementara sementara adalah apa yang akan diperiksa oleh mesin Javascript - dan jika ekspresi itu benar, itu akan membuat loop tetap berjalan. Menulis "benar" di sini selalu bernilai true, karenanya merupakan infinite loop.
sumber
Tentu, menggunakan
switch
konstruk yang dapat Anda simulasikangoto
dalam JavaScript. Sayangnya, bahasa tidak menyediakangoto
, tetapi ini cukup baik sebagai pengganti.sumber
Anda mungkin harus membaca beberapa tutorial JS seperti ini satu .
Tidak yakin apakah
goto
ada di JS sama sekali, tetapi, bagaimanapun, itu mendorong gaya pengkodean yang buruk dan harus dihindari.Anda bisa melakukannya:
sumber
Anda dapat menggunakan fungsi:
sumber
Untuk mencapai fungsionalitas seperti goto sambil menjaga tumpukan panggilan tetap bersih, saya menggunakan metode ini:
Harap perhatikan bahwa kode ini lambat karena panggilan fungsi ditambahkan ke antrean batas waktu, yang kemudian dievaluasi, dalam loop pembaruan browser.
Harap perhatikan juga bahwa Anda dapat memberikan argumen (menggunakan
setTimeout(func, 0, arg1, args...)
di browser yang lebih baru dari IE9, atausetTimeout(function(){func(arg1, args...)}, 0)
di browser yang lebih lama.AFAIK, Anda seharusnya tidak pernah menemukan kasus yang memerlukan metode ini kecuali jika Anda perlu menjeda loop yang tidak dapat diparalelkan dalam lingkungan tanpa dukungan async / menunggu.
sumber
mulai dan berakhir dari semua penutupan orang tua
sumber
sumber
Cara alternatif lain untuk mencapai hal yang sama adalah dengan menggunakan panggilan ekor. Namun, kami tidak memiliki yang seperti itu di JavaScript. Jadi secara umum, goto diselesaikan di JS menggunakan dua kata kunci di bawah ini. istirahat dan lanjutkan , referensi: Pernyataan Goto dalam JavaScript
Berikut ini sebuah contoh:
sumber