programing

자바스크립트에서 고투를 어떻게 사용할 수 있습니까?

codeshow 2023. 10. 9. 23:40
반응형

자바스크립트에서 고투를 어떻게 사용할 수 있습니까?

는 를 해야 하는 .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 RINSEgoto이 없고 수 .Hello, world!다음과 같이 자바스크립트 콘솔에 538번 메시지를 보냅니다.

var i = 0;
[lbl] start:
console.log("Hello, world!");
i++;
if(i < 538) goto start;

고투가 구현되는 방법에 대해자세히 읽을있지만, 기본적으로 라벨링된 루프로 고투를 시뮬레이션할 수 있다는 점을 활용한 자바스크립트 전처리를 수행합니다.그래서 위에 "Hello, world!" 프로그램을 쓰면 다음과 같이 번역됩니다.

var i = 0;
start: while(true) {
  console.log("Hello, world!");
  i++;
  if(i < 538) continue start;
  break;
}

루프가 여러 기능 또는 블록에 걸쳐 확장될 수 없기 때문에 이 전처리 과정에는 몇 가지 제한이 있습니다.별 일나..합니다를 할 수 합니다.goto자바스크립트에서는 절대적으로 당신을 압도할 것입니다.

goto.js 라이브러리로 이어지는 위의 모든 링크는 ALL DEAD이며, 필요한 링크는 다음과 같습니다.

goto.js(압축되지 않음) --- parseScripts.js(압축되지 않음)

From Goto.js:

아니요. ECMA스크립트에는 다음과 같은 내용이 포함되지 않았습니다.

ECMA스크립트에 문이 없습니다.

고전적인 자바스크립트에서는 이런 종류의 코드를 얻기 위해서는 도중 루프를 사용해야 합니다.아마도 당신이 다른 것에 대한 코드를 생성하고 있을 것입니다.

자바스크립트로 바이트코드를 백엔드하는 것과 마찬가지로 모든 라벨 대상을 "라벨링된" 작업을 수행하는 방법입니다.

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)

따라서 이 기술을 사용하면 간단한 목적으로 작업을 수행할 수 있습니다.그 외에는 당신이 할 수 있는 것이 별로 없습니다.

일반 자바스크립트의 경우 go to를 사용할 필요가 없으므로 자바스크립트에서 실행하기 위해 다른 스타일 코드를 특별히 번역하지 않는 한 여기서는 이 기법을 피해야 할 것입니다.예를 들어 자바스크립트에서 리눅스 커널을 부팅하는 방법이 그렇게 된다고 생각합니다.

참고! 이것은 모두 순진한 설명입니다.바이트 코드의 적절한 J 백엔드에 대해서도 코드를 출력하기 전에 루프를 검사하는 것을 고려합니다.단순한 루프가 많은 경우 이와 같이 감지될 수 있으며 대신 루프를 사용할 수도 있습니다.

사실 저는 ECMA스크립트(JavaScript)에 정말로 할 말이 있다고 봅니다.하지만 자바스크립트 고투에는 두 가지 맛이 있습니다!

고투의 두 가지 자바스크립트 맛은 라벨링된 계속과 라벨링된 단절이라고 불립니다.자바스크립트에는 "goto" 키워드가 없습니다.break and continue 키워드를 사용하여 자바스크립트로 고투를 수행합니다.

그리고 이것은 여기 w3 schools 웹사이트 http://www.w3schools.com/js/js_switch.asp 에 어느 정도 명시적으로 나와 있습니다.

라벨이 붙은 계속과 라벨이 붙은 깨짐의 설명서가 다소 어색하게 표현되어 있다고 생각합니다.

레이블이 지정된 연속형과 레이블이 지정된 단절형의 차이는 이들을 사용할 수 있는 위치에 있습니다.레이블이 지정된 continue는 while 루프에서만 사용할 수 있습니다.자세한 내용은 w3 학교를 참고하세요.

===========

또 다른 접근 방식은 내부에 거대한 스위치 문이 있는 동시에 거대한 문을 갖는 것입니다.

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. ...
    }

}

이것은 오래된 질문이지만, 자바스크립트가 움직이는 대상이기 때문에 ES6에서 적절한 테일콜을 지원하는 구현이 가능합니다.적절한 테일콜을 지원하는 구현에서는 무제한으로 활성 테일콜을 사용할 수 있습니다(즉, 테일콜이 "스택을 확장"하지 않음).

A 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가 D로를 합니다.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().

재작성은 순수하게 기계적인 것이므로 필요한 경우 sweet.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;
}

.switch할 수 .goto자바스크립트로.도 이 e를 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
  }
}

A 는는 어떻습니까?for루프? 원하는 만큼 반복합니다..while루프, 조건이 충족될 때까지 반복합니다.코드를 반복할 수 있는 제어 구조가 있습니다.나를 합니다.GOTO기본에서...그것은 아주 나쁜 코드를 만들었습니다!현대의 프로그래밍 언어는 실제로 유지할 수 있는 더 나은 옵션을 제공합니다.

이것을 할 수 있는 방법이 있지만 신중하게 계획할 필요가 있습니다.다음 QBASIC 프로그램을 예로 들어보겠습니다.

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");
}

그것은 무한한 고리가 있습니다.while 절의 괄호 안에 있는 표현식("true")은 자바스크립트 엔진이 체크하는 것이며, 표현식이 true이면 루프가 계속 작동합니다.여기서 "true"를 적으면 항상 true로 평가되므로 무한 루프가 발생합니다.

간단히 다음 기능을 사용할 수 있습니다.

function hello() {
    alert("RINSE");
    alert("LATHER");
    hello();
}

호출 스택을 깨끗하게 유지하면서 Goto-like 기능을 달성하기 위해 다음 방법을 사용합니다.

// 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)오래된 브라우저에서는

AFAIK, 비동기/대기 지원이 없는 환경에서 병렬이 불가능한 루프를 일시 중지할 필요가 없는 경우를 제외하고는 이 방법이 필요한 경우에 부딪쳐서는 안 됩니다.

// 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);
            }
        }

여러분은 아마 이것과 같은 JS 튜토리얼을 읽어보셔야 할 것입니다.

확실하지 않습니다gotoJS에는 전혀 존재하지만, 어느 쪽이든, 그것은 나쁜 코딩 스타일을 부추기므로 피해야 합니다.

할 수 있는 일:

while ( some_condition ){
    alert('RINSE');
    alert('LATHER');
}

모든 부모의 폐쇄를 시작하고 끝을 맺습니다.

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);

이를 달성하기 위한 또 다른 방법은 테일 콜을 사용하는 것입니다.하지만 자바스크립트에는 그런 것이 없습니다.그래서 일반적으로 고투는 JS에서 아래의 두 가지 키워드를 사용하여 이루어집니다. break and continue, reference:자바스크립트에서 문으로 이동

다음은 예입니다.

var number = 0;
start_position: while(true) {
document.write("Anything you want to print");
number++;
if(number < 100) continue start_position;
break;
}

루프나 어수선한 기능이 없는 자체 솔루션을 발견한 이후로 2센트를 투자했습니다.

function rinseLatherSwitch(label) 
{
    function goto(to)
    {
        switch(to)
        {
            case "rinse": alert("RINSE"); return goto("lather");
            case "lather": alert("LATHER"); return goto("end");
            case "end": break;
        }
    }

    return goto(label);
}

rinseLatherSwitch("rinse");

이 형식은 3가지 이점이 있습니다.

  1. 코드의 구조는 다른 언어 스위치와 고투(예: C#)가 일치합니다.
  2. 단일 기능 내에 모두 자체적으로 포함되므로 다른 코드를 방해하지 않습니다.
  3. 무한 루프뿐만 아니라 추가 작업 없이 모든 이동 상황을 처리할 수 있습니다(실제로 제 책에 나와 있는 스택 오버플로로 인해 루프가 무한하지 않습니다).

언급URL : https://stackoverflow.com/questions/9751207/how-can-i-use-goto-in-javascript

반응형