関数の早期終了?


402

私には機能があります:

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

exit()JavaScriptのようなものはありますか?


4
実行を停止しますか、それとも戻りますか?
Ken Struys、2010

@Ken Struys違いは何ですか?私が理解しているように、戻ると、実行が停止しますか?ね?
Simon

3
ええと、これが問題です。returnを使用すると、呼び出し元の関数のコンテキストに戻ります。:あなたが実際にあなたが実行を停止したい出口はセマンティックたい場合は、このような何か行うことができます vikku.info/codesnippets/javascript/...
ケンStruys

1
@ケン-あなたが提供したリンクは、forループの実行の停止を扱っています。それでも、を呼び出すだけで、提案されたメソッドを使用する理由がわかりませんbreak;。記事の例を使用するには:if(i==5) break;を使用returnすると、forループに入っているかどうかに関係なく、関数の実行が停止します。
user113716 2010

Syom-はい、return関数の実行を停止します。これは、ユーザーが要求したようです。
user113716 2010

回答:


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
私はこれが古い投稿であることを知っています、そしてこれは一般的な慣行ですが、これは悪い解決策だと思います。関数が値を返すようにサポートされている場合は、returnを使用する必要があります。盲目的にreturnを使用すると、後で問題が発生する可能性があります。特に、リターンがあるイベントのバインドを開始した場合。詳細については、この投稿を確認してください。fuelyourcoding.com

64
@dbme:JavaScriptの関数は常に戻ります。提供されていない場合、returnステートメントは暗黙的です。デフォルトの戻り値はでundefined、これが私の主要なソリューションが提供するものです。あなたが参照した記事return falseは、jQueryイベントハンドラーで行うことについて話しています。それはまったく別の問題です。これは、JavaScript関数を終了する適切な方法です。明らかに、呼び出し元が返された値に依存している場合、値を適切に定義する必要があります。
user113716 2011

3
...暗黙的なバリエーションは、明示的なを提供せずにが等しくないif(a != 'stop') { /* run my code */ }場合にのみコードが実行されるようにするものです。しかし、戻り値は私のソリューションと同じです。どちらの場合も返却されます。a'stop'returnundefined
user113716 2011

3
素晴らしい反応。未定義を返すか、偽を返すか、異なる値を返すのに違いがあることに気づきませんでした。過去1時間、この動作に関する決定的な答えを見つけようと努めてきました。したがって、呼び出し側がイベントなどにバインドされている場合でも、リターンはメソッドを終了するための100%安全な方法であると(あなたのポイントを繰り返すと)言っても安全ですか?

@dbme:まあ、それはすべて、関数を呼び出すメソッドが何を期待するかに依存します。一部のコードライブラリがundefined、戻り値として受け取った場合(または他の値を受け取っていない場合)に機能しなくなるイベントシステムを定義している場合は、そのAPIの仕様に準拠し、正しい値を返す必要があります。一般に、イベント処理システムではundefined、ハンドラーが終了したことを単純に示し、それ以上の指示はありません。jQueryでは、return false;a preventDefaultとを実行するように指示する特別な意味がありstopPropagationます。
user113716 2011

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
アダムマッカーサー2014年

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

すべてのエラーアラートを一度に受信するか、1つだけ通知するかによって異なります。ただし、いずれにしても各条件を実行する必要があります。
レオ

0

新しいエラーをスローすることは、単にreturnまたはfalseを返すのではなく、実行を停止するための良いアプローチだと思います。例のために。個別の機能でのアップロードに最大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をスローしない限り、実行を停止できません。returnまたはreturn 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.