기능이 조기에 종료 되었습니까?


402

나는 기능을 가지고있다 :

function myfunction() {
  if (a == 'stop')  // How can I stop the function here?
}

exit()JavaScript 와 같은 것이 있습니까?


4
실행을 중지하거나 돌아 오시겠습니까?
Ken Struys

@ Ken Struys 차이점은 무엇입니까? 내가 이해하는 것처럼, 반환하면 실행이 중지됩니까? 그렇지 않습니까?
Simon

3
자, 여기에 리턴 값을 사용하면 호출 함수의 컨텍스트로 돌아갑니다. 실행을 중지하려는 종료 의미를 실제로 원한다면 다음과 같이 할 수 있습니다. vikku.info/codesnippets/javascript/…
Ken Struys

1
@Ken-이 링크는 for루프 실행 중지를 다룬다 . 그럼에도 불구하고 전화를 걸 수있을 때 제안 된 방법이 왜 사용되는지 모르겠습니다 break;. 기사의 예제를 사용하려면 : 루프를 사용 하는지 여부에 관계없이 if(i==5) break;Using return는 함수 실행을 중지합니다 for.
user113716

Syom-예, return요청한 것처럼 보이는 함수의 실행을 중지합니다.
user113716

답변:


639

당신은 그냥 사용할 수 있습니다 return.

function myfunction() {
     if(a == 'stop') 
         return;
}

undefined함수는 호출 된 값을 반환 합니다.

var x = myfunction();

console.log( x );  // console shows undefined

물론 다른 반환 값을 지정할 수 있습니다. 반환 된 값은 위의 예를 사용하여 콘솔에 기록됩니다.

return false;
return true;
return "some string";
return 12345;

4
나는 이것이 오래된 게시물이라는 것을 알고 있으며 이것은 일반적인 관행이지만 이것이 나쁜 해결책이라고 생각합니다. 함수가 SUPPOSED를 사용하여 값을 반환하면 return을 사용해야합니다. 맹목적으로 반환을 사용하면 나중에 문제가 발생할 수 있습니다. 특히 리턴되는 이벤트 바인딩을 시작하는 경우. 자세한 정보는 다음 게시물을 확인하십시오 : fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme : JavaScript의 함수는 항상 반환합니다. return 문은 제공되지 않은 경우 암시 적입니다. 기본 반환 값은 undefined입니다. 이것이 기본 솔루션입니다. 당신이 언급 한 기사 return false는 jQuery 이벤트 핸들러에서의 작업 에 대해 이야기하고 있습니다. 그것은 완전히 다른 문제입니다. 이것은 JavaScript 함수를 종료하는 올바른 방법입니다. 호출자가 반환 된 값에 의존하는 경우 값을 적절하게 정의해야합니다.
113716

3
... 암시 적 변형은 명시 if(a != 'stop') { /* run my code */ }적을 제공 a하지 않고 코드 가 같지 않을 때만 실행되도록합니다 . 그러나 반환 값 은 내 솔루션과 동일합니다 . 두 경우 모두 반환됩니다. 'stop'returnundefined
user113716

3
멋진 반응. undefined와 false를 반환하는 것과 다른 값을 반환하는 것 사이에 어떤 차이가 있는지 몰랐습니다. 지난 한 시간 동안이 행동에 관한 확실한 대답을 찾으려고 노력했습니다. 따라서 호출자가 이벤트 등에 묶여 있어도 리턴이 메소드를 종료하는 100 % 안전한 방법이라고 말하는 것이 안전합니까?

@dbme : 글쎄, 그것은 모두 함수를 호출하는 메소드가 기대하는 것에 달려 있습니다. 일부 코드 라이브러리 undefined가 리턴 값으로 수신하거나 다른 값을 수신하지 않으면 중단 될 이벤트 시스템을 정의하는 경우 해당 API의 스펙을 준수하고 올바른 값을 리턴해야합니다. 일반적으로 이벤트 처리 시스템의 경우, undefined처리기가 완료되었다는 단순한 표시로 예상 되며 추가 지시 사항이 없습니다. jQuery를 사용하면 return false;a preventDefault및 을 수행하라는 명령을 내릴 수 stopPropagation있습니다.
user113716

49

분명히 당신은 이것을 할 수 있습니다 :

function myFunction() {myFunction:{
    console.log('i get executed');
    break myFunction;
    console.log('i do not get executed');
}}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label 레이블을 사용하여 블록 범위를 참조하십시오.

아직 단점이 없습니다. 그러나 일반적인 용도는 아닙니다.

이 답변을 도출 : PHP의 주사위와 동등한 JavaScript


이 솔루션을 nodejs 내보내기 모듈과 함께 사용할 수 있습니까? 시도하면 "사용하지 않은 레이블"오류가 발생합니다. exports.MyFunction = function (data) {myFunction : {break myFunction;}}
Yuri Almeida

20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; 그냥보다 훨씬 낫다 return;


13
false더 낫습니까? undefined일반적인 경우 에는 기본값 이 더 좋다고 말하고 싶습니다 . 어느 쪽이든 의미있는 값을 반환하는 것이 더 낫다고 말하는 것이 맞습니다.
Brad Koch

프로그래머에게 달려 있으며 사용 사례에 따라 다릅니다. 유효성 검사가 수익에 더 많은 의미가 실패 할 경우 예를 들어, 함수, 그래서 뭔가를 확인할 수있는 false것보다 undefined.
Adam McArthur

18

이:

function myfunction()
{
     if (a == 'stop')  // How can I stop working of function here?
     {
         return;
     }
}

11

조금 다른 접근 방식을 사용 try catch하면 throw 문과 함께을 사용할 수 있습니다 .

function name() {
    try {
        ...

        //get out of here
        if (a == 'stop')
            throw "exit";

        ...
    } catch (e) {
        // TODO: handle exception
    }
}

3

오류가 발견되었을 때 양식을 제출하지 않도록 스크립트를 찾고 있다면이 방법이 효과가 있습니다.

function verifyData(){
     if (document.MyForm.FormInput.value.length == "") {
          alert("Write something!");
     }
     else {
          document.MyForm.submit();
     }
}

변경 버튼 제출 "버튼"을 유형

<input value="Save" type="button" onClick="verifyData()">

이 도움을 바랍니다.


2

a return를 사용 하면 함수가 중지되고 return undefined또는 return 명령으로 지정한 값이 반환됩니다.

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}

1

나는 실제 해결책이 아닌 것들에 대답하는 것을 싫어합니다 ...

...하지만이 같은 문제가 발생했을 때 아래 해결 방법을 만들었습니다.

function doThis() {
  var err=0
  if (cond1) { alert('ret1'); err=1; }
  if (cond2) { alert('ret2'); err=1; }
  if (cond3) { alert('ret3'); err=1; }
  if (err < 1) {
    // do the rest (or have it skipped)
  }
}

그것이 누군가에게 유용 할 수 있기를 바랍니다.


어. 내가 생각하지 않은 것은 너무나 간단합니다 !! 큰 중첩 IF를 피하는 데 매우 유용합니다. 감사.
Debbie A

스위치를 사용하면 더 좋습니다.
bdelmas

모든 오류 경고를 한 번에 알리고 싶은지 여부에 따라 다릅니다. 그러나 각 조건은 어쨌든 실행되어야합니다.
레오

0

새로운 오류를 던지는 것은 단순히 반환하거나 거짓을 반환하는 대신 실행을 중지하는 좋은 접근 방법이라고 생각합니다. 예를 들어. 별도의 기능으로 최대 5 개의 파일 만 업로드 할 수있는 많은 파일을 확인하고 있습니다.

validateMaxNumber: function(length) {
   if (5 >= length) {
        // Continue execution
   }
   // Flash error message and stop execution
   // Can't stop execution by return or return false statement; 
   let message = "No more than " + this.maxNumber + " File is allowed";
   throw new Error(message);
}

그러나이 흐름을 메인 플로우 함수에서

  handleFilesUpload() {
      let files =  document.getElementById("myFile").files;
      this.validateMaxNumber(files.length);
}

위의 예제에서 새로운 Error를 던지지 않으면 실행을 멈출 수 없습니다. 반환 또는 false를 반환하면 실행의 주요 기능이있는 경우에만 작동합니다. 그렇지 않으면 작동하지 않습니다.



-4

jquery를 사용하는 경우 이렇게하면 함수가 버블 링되는 것을 막을 수 있으므로 이것을 호출하는 부모 함수도 중지해야합니다.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }

6
stopImmediatePropagation()는 jQuery가 아니며 전파 중지는 함수를 종료하는 것과 다릅니다.
Brad Koch

-13

오류를 발생시키는 임의의 명령을 입력하십시오 (예 :

exit

또는

die:-)

이로 인해 나머지 함수뿐만 아니라 모든 코드가 실행되지 않을 수 있습니다. 바이올린을 확인하십시오 : jsfiddle.net/b3k0xo7n/1
treecon

1
끔찍한 프로그래밍 방식. 동일한 코드베이스에서 작업하는 다른 개발자에게는 이것이 어떻게 직관적입니까?
osullic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.