আমার কিছু কোড রয়েছে যা ব্যবহার করে আমার অবশ্যই বাস্তবায়ন করতে হবে goto
। উদাহরণস্বরূপ, আমি এই জাতীয় একটি প্রোগ্রাম লিখতে চাই:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
জাভাস্ক্রিপ্টে এটি করার কোনও উপায় আছে?
আমার কিছু কোড রয়েছে যা ব্যবহার করে আমার অবশ্যই বাস্তবায়ন করতে হবে goto
। উদাহরণস্বরূপ, আমি এই জাতীয় একটি প্রোগ্রাম লিখতে চাই:
start:
alert("RINSE");
alert("LATHER");
repeat: goto start
জাভাস্ক্রিপ্টে এটি করার কোনও উপায় আছে?
উত্তর:
কাফনের কাপড়! সামার অফ গোটো নামে একটি প্রকল্প রয়েছে যা আপনাকে জাভাস্ক্রিপ্টকে তার সম্পূর্ণ সম্ভাবনায় ব্যবহার করতে দেয় এবং আপনি আপনার কোডটি কীভাবে লিখতে পারবেন তাতে বিপ্লব ঘটাবে।
এই জাভাস্ক্রিপ্ট প্রিপ্রোসেসিং সরঞ্জামটি আপনাকে একটি লেবেল তৈরি করতে এবং তারপরে এই সিনট্যাক্সটি ব্যবহার করে তা করার অনুমতি দেয়:
[lbl] <label-name>
goto <label-name>
উদাহরণস্বরূপ, প্রশ্নের উদাহরণটি নিম্নরূপ লেখা যেতে পারে:
[lbl] start:
alert("LATHER");
alert("RINSE");
[lbl] repeat: goto start;
মনে রাখবেন যে আপনি কেবল একটি অন্তহীন LATHER
RINSE
পুনরাবৃত্ত চক্রের মতো সাধারণ তুচ্ছ প্রোগ্রামের মধ্যেই সীমাবদ্ধ নন - সম্ভাব্য সুযোগগুলি goto
অন্তহীন এবং আপনি Hello, world!
জাভাস্ক্রিপ্ট কনসোলে 538 বার এই বার্তা দিতে পারেন:
var i = 0;
[lbl] start:
console.log("Hello, world!");
i++;
if(i < 538) goto start;
গোটো কীভাবে কার্যকর করা হয় সে সম্পর্কে আপনি আরও পড়তে পারেন তবে মূলত এটি কিছু জাভাস্ক্রিপ্ট প্রিপ্রোসেসিং করে যা আপনি লেবেলযুক্ত while
লুপের সাহায্যে একটি গোটো অনুকরণ করতে পারবেন এই সুবিধাটি গ্রহণ করে । সুতরাং, আপনি যখন লিখবেন "হ্যালো, বিশ্ব!" উপরের প্রোগ্রামটি, এটি এরকম কিছুতে অনুবাদিত হয়:
var i = 0;
start: while(true) {
console.log("Hello, world!");
i++;
if(i < 538) continue start;
break;
}
এই প্রিপ্রোসেসিং প্রক্রিয়াটির কিছু সীমাবদ্ধতা রয়েছে কারণ লুপগুলি একাধিক ফাংশন বা ব্লকগুলিতে প্রসারিত করতে পারে না। এটি কোনও বড় কথা নয়, যদিও — আমি নিশ্চিত goto
জাভাস্ক্রিপ্টে সুবিধা নিতে সক্ষম হওয়ার সুবিধা আপনাকে একেবারে অভিভূত করবে।
উপরের সমস্ত লিঙ্ক যা Goo.js লাইব্রেরিতে পৌঁছেছে সমস্ত মৃত, এখানে লিঙ্কগুলি প্রয়োজন:
geto.js (সঙ্কুচিত) --- পার্সস্ক্রিপ্ট.জেএস (সংকোচিত)
গোটো.জেএস থেকে :
পিএস যে যে কেউ ভাবছেন (এখনও অবধি মোট শূন্য লোক), সামার অফ গোটো এমন একটি শব্দ যা পল আইরিশ জনপ্রিয় করেছিল, এই স্ক্রিপ্ট এবং পিএইচপি-র ভাষায় গোটো যুক্ত করার বিষয়ে আলোচনা করার সময়।
এবং যারা তাত্ক্ষণিকভাবে বুঝতে পারেন না যে এই পুরো জিনিসটি একটি রসিকতা, দয়া করে আমাকে ক্ষমা করুন। <- (বীমা)।
goto
সম্ভবত স্বল্প-ব্যবহৃত হয়েছে। এটি কিছু খুব সুন্দর ত্রুটি পরিচালনার নিদর্শনগুলির জন্য তৈরি করে। মুরগি, আমরা ব্যবহার করি switch
, যা goto
নাম ব্যতীত সমস্ত কিছুই , এবং কেউ পেট-ব্যথা করে না।
নং তারা ইসকামাস্ক্রিপ্টে এটি অন্তর্ভুক্ত করেনি:
ইসমাস্ক্রিপ্টের কোনও বিবৃতি নেই।
goto
goto
তবে ভবিষ্যতে ব্যবহারের জন্য একটি সংরক্ষিত কীওয়ার্ড। আমরা কেবল আশা করতে পারি :)
goto
আপনি কোনও নেস্টেড ফাংশন থেকে ফিরে আসতে চাইলে দরকারী হবে। উদাহরণস্বরূপ, আন্ডারস্কোর.জেএস ব্যবহার করার সময় অ্যারেগুলিতে পুনরাবৃত্তি করার সময় আপনি একটি বেনামি ফাংশন সরবরাহ করেন। আপনি যেমন একটি ফাংশন ভিতরে থেকে ফিরে আসতে পারবেন না, তাই goto end;
দরকারী হবে।
আসলে, আমি দেখতে পাচ্ছি যে ECMAScript (জাভাস্ক্রিপ্ট) এর একটি বিবৃতি রয়েছে। তবে জাভাস্ক্রিপ্টের গোটোতে দুটি স্বাদ আছে!
গোটোতে দুটি জাভাস্ক্রিপ্ট স্বাদকে লেবেলযুক্ত চালিয়ে যাওয়া এবং লেবেল বিরতি বলা হয়। জাভাস্ক্রিপ্টে "গোটো" কোনও কীওয়ার্ড নেই। গেটো জাভাস্ক্রিপ্টে ব্রেক এবং অবিরত কীওয়ার্ড ব্যবহার করে সম্পন্ন হয়েছে।
এবং এটি কম-বেশি স্পষ্টভাবে এখানে ডাব্লু 3 স্কুল ওয়েবসাইট http://www.w3schools.com/js/js_switch.asp এ স্পষ্টভাবে বলা হয়েছে ।
আমি লেবেল অবিরত এবং লেবেল বিরতির কিছুটা বিশ্রীভাবে প্রকাশিত ডকুমেন্টেশনটি পেয়েছি।
লেবেলযুক্ত চালিয়ে যাওয়া এবং লেবেল বিরতির মধ্যে পার্থক্য হ'ল এগুলি ব্যবহার করা যেতে পারে। লেবেলযুক্ত চালিয়ে যাওয়া কেবলমাত্র কিছুক্ষণের লুপের মধ্যে ব্যবহার করা যেতে পারে। আরও কিছু তথ্যের জন্য ডাব্লু 3 স্কুলগুলি দেখুন।
===========
আরেকটি পদ্ধতি যা কাজ করবে তা হ'ল ভিতরে জায়ান্ট সুইচ স্টেটমেন্ট সহ বিবৃতি দেওয়ার সময় একটি দৈত্য থাকা:
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. ...
}
}
break
এবং লুপগুলিতেও continue
ব্যবহৃত হতে পারে for
। তবে তারা সত্যই যে এটি সম্পর্কিত লুপ (গুলি) এর কাঠামোতে লক হয়ে গেছে তার সমতুল্য নয়goto
, তুলনামূলকভাবে যে তুলনায় goto
- এটি যে ভাষাগুলিতে রয়েছে - যে কোনও জায়গায় যেতে পারেন।
ক্লাসিক জাভাস্ক্রিপ্টে এই ধরণের কোড অর্জনের জন্য আপনাকে ডু-ওয়েল লুপগুলি ব্যবহার করতে হবে। আমি ধারণা করছি আপনি সম্ভবত অন্য কোনও জিনিসের জন্য কোড তৈরি করছেন।
এটি করার উপায়, যেমন জাভাস্ক্রিপ্টে বাইটকোড ব্যাকেন্ডিংয়ের জন্য হ'ল "লেবেলযুক্ত" -র সময় প্রতিটি লেবেল লক্ষ্যকে মোড়ানো।
LABEL1: do {
x = x + 2;
...
// JUMP TO THE END OF THE DO-WHILE - A FORWARDS GOTO
if (x < 100) break LABEL1;
// JUMP TO THE START OF THE DO WHILE - A BACKWARDS GOTO...
if (x < 100) continue LABEL1;
} while(0);
আপনি এর মতো ব্যবহার করেন এমন প্রতিটি লেবেল করা ডু-ওয়েল লুপ আসলে একটি লেবেলের জন্য দুটি লেবেল পয়েন্ট তৈরি করে। শীর্ষে একটি এবং লুপের শেষে একটি। পিছনে ঝাঁপ দেওয়া অবিরত ব্যবহার করে এবং সামনের দিকে ঝাঁপুনি বিরতি ব্যবহার করে।
// NORMAL CODE
MYLOOP:
DoStuff();
x = x + 1;
if (x > 100) goto DONE_LOOP;
GOTO MYLOOP;
// JAVASCRIPT STYLE
MYLOOP: do {
DoStuff();
x = x + 1;
if (x > 100) break MYLOOP;
continue MYLOOP;// Not necessary since you can just put do {} while (1) but it illustrates
} while (0)
দুর্ভাগ্যক্রমে এটি করার কোনও উপায় নেই।
সাধারণ উদাহরণ কোড:
while (x < 10 && Ok) {
z = 0;
while (z < 10) {
if (!DoStuff()) {
Ok = FALSE;
break;
}
z++;
}
x++;
}
সুতরাং বলুন কোডটি বাইটকোডগুলিতে এনকোড হয়ে গেছে তাই এখন কোনও উদ্দেশ্যে আপনার ব্যাকএন্ড অনুকরণ করতে আপনাকে জাভাস্ক্রিপ্টে বাইটকোডগুলি লাগাতে হবে।
জাভাস্ক্রিপ্ট শৈলী:
LOOP1: do {
if (x >= 10) break LOOP1;
if (!Ok) break LOOP1;
z = 0;
LOOP2: do {
if (z >= 10) break LOOP2;
if (!DoStuff()) {
Ok = FALSE;
break LOOP2;
}
z++;
} while (1);// Note While (1) I can just skip saying continue LOOP2!
x++;
continue LOOP1;// Again can skip this line and just say do {} while (1)
} while(0)
সুতরাং এই কৌশলটি ব্যবহার সহজ কাজ জন্য কাজ সূক্ষ্ম কাজ করে। এটি ছাড়া আর কিছু না আপনি করতে পারেন।
সাধারণ জাভাক্রিপ্টের জন্য আপনাকে গোটো ব্যবহারের দরকার নেই, সুতরাং আপনি সম্ভবত জাভাস্ক্রিপ্টে চালানোর জন্য অন্যান্য স্টাইল কোড অনুবাদ না করেই এই কৌশলটি এড়ানো উচিত। আমি ধরে নিলাম যে তারা উদাহরণস্বরূপ জাভাস্ক্রিপ্টে লিনাক্স কার্নেলটি বুট করতে পারে।
বিঃদ্রঃ! এটি সব নিষ্পাপ ব্যাখ্যা। বাইটকোডগুলির সঠিক জেএস ব্যাকএন্ডের জন্য কোড আউটপুট দেওয়ার আগে লুপগুলি পরীক্ষা করার বিষয়টিও বিবেচনা করুন। অনেকগুলি সরল অবস্থায় লুপগুলি সনাক্ত করা যায় এবং তারপরে আপনি গোটোর পরিবর্তে লুপগুলি ব্যবহার করতে পারেন।
continue
একটি do ... while
লুপ চেক শর্ত অবিরত । এখানে পিছনের দিকে এভাবে goto
ব্যবহার do ... while (0)
করে কাজ হয় না। ecma-international.org/ecma-262/5.1/#sec-12.6.1
let doLoop
এটি কাজ করতে হবে। আর প্রধান লুপ: let doLoop = false; do { if(condition){ doLoop = true; continue; } } while (doLoop)
github.com/patarapolw/HanziLevelUp/blob/...
এটি একটি পুরানো প্রশ্ন, তবে যেহেতু জাভাস্ক্রিপ্ট একটি চলমান লক্ষ্য - এটি বাস্তবায়নের ক্ষেত্রে ES6 এ সম্ভব যা সঠিক লেজ কলকে সমর্থন করে। যথাযথ লেজ কলগুলির সহায়তায় বাস্তবায়নের সময়, আপনার অবিরাম সংখ্যক সক্রিয় লেজ কল থাকতে পারে (যেমন টেল কলগুলি "স্ট্যাকটি বৃদ্ধি করে না")।
একজন goto
কোন প্যারামিটার সঙ্গে একটি পুচ্ছ কল হিসেবে ভাবা যেতে পারে।
উদাহরণ:
start: alert("RINSE");
alert("LATHER");
goto start
হিসাবে লেখা যেতে পারে
function start() { alert("RINSE");
alert("LATHER");
return start() }
এখানে কলটি start
লেজ অবস্থানে রয়েছে, তাই কোনও স্ট্যাকের ওভারফ্লো হবে না।
এখানে আরও জটিল উদাহরণ:
label1: A
B
if C goto label3
D
label3: E
goto label1
প্রথমত, আমরা উত্সকে ব্লকে বিভক্ত করি। প্রতিটি লেবেল একটি নতুন ব্লকের সূচনা নির্দেশ করে।
Block1
label1: A
B
if C goto label3
D
Block2
label3: E
goto label1
গোটস ব্যবহার করে আমাদের ব্লকগুলি একসাথে আবদ্ধ করতে হবে। উদাহরণস্বরূপ ব্লক E ডি অনুসরণ করে, তাই আমরা একটি goto label3
ডি পরে যুক্ত করব
Block1
label1: A
B
if C goto label2
D
goto label2
Block2
label2: E
goto label1
এখন প্রতিটি ব্লক একটি ফাংশন হয়ে যায় এবং প্রতিটি গিট একটি টেইল কল হয়ে যায়।
function label1() {
A
B
if C then return( label2() )
D
return( label2() )
}
function label2() {
E
return( label1() )
}
প্রোগ্রামটি শুরু করতে, ব্যবহার করুন label1()
।
পুনর্লিখনটি সম্পূর্ণরূপে যান্ত্রিক এবং প্রয়োজনে মিষ্টি.js এর মতো ম্যাক্রো সিস্টেমের সাহায্যে এটি করা যেতে পারে।
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;
}
কিভাবে একটি for
লুপ সম্পর্কে ? আপনি যতবার চান পুনরাবৃত্তি। বা একটি while
লুপ, শর্ত পূরণ না হওয়া পর্যন্ত পুনরাবৃত্তি করুন। নিয়ন্ত্রণ কাঠামো রয়েছে যা আপনাকে কোডটি পুনরাবৃত্তি করতে দেবে। আমার GOTO
বেসিক মনে আছে ... এটি এমন খারাপ কোড করেছে! আধুনিক প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি আপনাকে আরও ভাল বিকল্প দেয় যা আপনি আসলে বজায় রাখতে পারেন।
এটি করার একটি উপায় রয়েছে তবে এটি সাবধানতার সাথে পরিকল্পনা করা দরকার। উদাহরণস্বরূপ নিম্নলিখিত কিউবিসিক প্রোগ্রামটি ধরুন:
1 A = 1; B = 10;
10 print "A = ",A;
20 IF (A < B) THEN A = A + 1; GOTO 10
30 PRINT "That's the end."
তারপরে প্রথমে সমস্ত ভেরিয়েবল শুরু করার জন্য আপনার জাভাস্ক্রিপ্ট তৈরি করুন, তারপরে বল রোলিং শুরু করার জন্য প্রাথমিক ফাংশন কল করা (আমরা শেষে এই প্রাথমিক ফাংশন কলটি কার্যকর করি), এবং প্রতিটি লাইনের জন্য যে ফাংশনগুলি কার্যকর করা হবে তাতে সেট আপ করুন এক ইউনিট
প্রাথমিক ফাংশন কল দিয়ে এটি অনুসরণ করুন ...
var a, b;
function fa(){
a = 1;
b = 10;
fb();
}
function fb(){
document.write("a = "+ a + "<br>");
fc();
}
function fc(){
if(a<b){
a++;
fb();
return;
}
else
{
document.write("That's the end.<br>");
}
}
fa();
এই উদাহরণস্বরূপ ফলাফল:
a = 1
a = 2
a = 3
a = 4
a = 5
a = 6
a = 7
a = 8
a = 9
a = 10
That's the end.
সাধারণত, আমি খারাপ পাঠযোগ্যতার জন্য GoTo ব্যবহার না করা পছন্দ করতাম। আমার কাছে, এটি পুনরাবৃত্ত ক্রিয়াকলাপগুলির পরিবর্তে সহজ পুনরাবৃত্তি ফাংশনগুলি প্রোগ্রাম করার জন্য বা এটি আরও ভাল (যদি স্ট্যাক ওভারফ্লোয়ের মতো জিনিসগুলি ভয় পায়), তাদের সত্যিকারের পুনরাবৃত্তির বিকল্পগুলি (যা কখনও কখনও জটিল হতে পারে) এর খারাপ অজুহাত।
এরকম কিছু কাজ করবে:
while(true) {
alert("RINSE");
alert("LATHER");
}
ডানদিকে আছে একটি অসীম লুপ। জাতির স্ক্রিপ্ট ইঞ্জিন যা যা জাভাস্ক্রিপ্টের ইঞ্জিনের জন্য যাচাই করবে - সেই সময়কার অনুচ্ছেদের অভ্যন্তরে প্রকাশ ("সত্য") - এবং যদি অভিব্যক্তিটি সত্য হয় তবে এটি লুপটিকে চলমান রাখবে। এখানে "সত্য" লেখা সর্বদা সত্যকে মূল্যায়ন করে, অতএব অসীম লুপ।
অবশ্যই, আপনি জাভাস্ক্রিপ্টে switch
অনুকরণ করতে পারেন কনস্ট্রাক্ট ব্যবহার goto
করে। দুর্ভাগ্যক্রমে, ভাষা সরবরাহ করে না goto
, তবে এটি প্রতিস্থাপনের পক্ষে যথেষ্ট ভাল।
let counter = 10
function goto(newValue) {
counter = newValue
}
while (true) {
switch (counter) {
case 10: alert("RINSE")
case 20: alert("LATHER")
case 30: goto(10); break
}
}
আপনি সম্ভবত এই মত কিছু জাতীয় টিউটোরিয়াল পড়া উচিত এক ।
goto
জেএসে আদৌ বিদ্যমান কিনা তা নিশ্চিত নয়, তবে, যে কোনও উপায়ে এটি খারাপ কোডিং শৈলীতে উত্সাহ দেয় এবং এড়ানো উচিত।
আপনি করতে পারেন:
while ( some_condition ){
alert('RINSE');
alert('LATHER');
}
আপনি একটি ফাংশন সাধারণভাবে ব্যবহার করতে পারেন:
function hello() {
alert("RINSE");
alert("LATHER");
hello();
}
কল স্ট্যাকটি পরিষ্কার রাখার সময় গোটো-মতো কার্যকারিতা অর্জন করতে, আমি এই পদ্ধতিটি ব্যবহার করছি:
// in other languages:
// tag1:
// doSomething();
// tag2:
// doMoreThings();
// if (someCondition) goto tag1;
// if (otherCondition) goto tag2;
function tag1() {
doSomething();
setTimeout(tag2, 0); // optional, alternatively just tag2();
}
function tag2() {
doMoreThings();
if (someCondition) {
setTimeout(tag1, 0); // those 2 lines
return; // imitate goto
}
if (otherCondition) {
setTimeout(tag2, 0); // those 2 lines
return; // imitate goto
}
setTimeout(tag3, 0); // optional, alternatively just tag3();
}
// ...
দয়া করে মনে রাখবেন যে এই কোডটি ধীরে ধীরে ধীরে ধীরে ফাংশন কলগুলি টাইমআউটস সারিতে যুক্ত করা হয় যা পরে মূল্যায়ন করা হয় ব্রাউজারের আপডেট লুপে।
দয়া করে নোট করুন যে আপনি আর্গুমেন্টগুলি পাস করতে পারবেন ( setTimeout(func, 0, arg1, args...)
IE9 এর চেয়ে নতুন ব্রাউজারে বা setTimeout(function(){func(arg1, args...)}, 0)
পুরানো ব্রাউজারগুলিতে ব্যবহার করতে পারেন) ।
আফাইক, আপনার অ্যাসিঙ্ক / সমর্থন অপেক্ষা না করে পরিবেশে অ-সমান্তরাল লুপটি বিরতি দেওয়ার প্রয়োজন না হলে আপনার এই পদ্ধতির প্রয়োজন হয় না।
সমস্ত পিতামাতার বন্ধের শুরু এবং শেষ আছে
var foo=false;
var loop1=true;
LABEL1: do {var LABEL1GOTO=false;
console.log("here be 2 times");
if (foo==false){
foo=true;
LABEL1GOTO=true;continue LABEL1;// goto up
}else{
break LABEL1; //goto down
}
console.log("newer go here");
} while(LABEL1GOTO);
// example of goto in javascript:
var i, j;
loop_1:
for (i = 0; i < 3; i++) { //The first for statement is labeled "loop_1"
loop_2:
for (j = 0; j < 3; j++) { //The second for statement is labeled "loop_2"
if (i === 1 && j === 1) {
continue loop_1;
}
console.log('i = ' + i + ', j = ' + j);
}
}
এটি অর্জনের আর একটি বিকল্প উপায় হ'ল লেজ কলগুলি। তবে, জাভাস্ক্রিপ্টে আমাদের মতো কিছু নেই। সুতরাং সাধারণত, জিতো নীচে দুটি কীওয়ার্ড ব্যবহার করে জেএসে সম্পন্ন হয়। বিরতি এবং চালিয়ে যান , উল্লেখ: জাভাস্ক্রিপ্টে গোটো বিবৃতি State
এখানে একটি উদাহরণ:
var number = 0;
start_position: while(true) {
document.write("Anything you want to print");
number++;
if(number < 100) continue start_position;
break;
}