JavaScriptでスクリプトを終了する方法は?


149

PHPのようにJavaScriptスクリプトを終了するにはどうすればexitよいdieですか?私はそれがプログラミングのベストプラクティスではないことを知っていますが、そうする必要があります。


1
この要件を拡張できると思いますか?正確になぜこれを達成しようとしているのですか?
andynormancx 2009

8
@andynormancx、これはデバッグに便利です。
SET

3
ちょうどreturn;あなたの要件に応じて、パラメータを指定せずに)、(ダイのような働きは十分かもしれません。
石川

2
あなたがそれを「必要とする」なら、あなたはあなたのデザインを再考する方が良いかもしれません。
フルンギ2018

18
なぜ常に最初の質問が「なぜ」なのですか?
john ktejik

回答:


80

PHPと同等のJavaScriptdie。ところでそれは呼び出すだけですexit()(splattneに感謝します):

function exit( status ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null

    var i;

    if (typeof status === 'string') {
        alert(status);
    }

    window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false);

    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',
        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];

    function stopPropagation (e) {
        e.stopPropagation();
        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    }

    if (window.stop) {
        window.stop();
    }

    throw '';
}

1
出口のソースコードは次のとおり
splattne

そのコードは、要素のイベントの起動を停止しているようには見えません。ウィンドウのイベントだけです。したがって、ページ上のすべての要素をループして同様のことを行う必要もあります。それはすべて非常に奇妙な要件のように聞こえますが。
andynormancx 2009

2
ダイ全体の概念は少し壊れています。フローは、トライキャッチを要求するかどうかに関係なく、すべての不測の事態を処理できる必要があります。
アナカタ09

「selectstart」イベントなど、処理する必要があるすべてのイベントが含まれていないと思います。
小野大神2016年

4
XMLHttpRequestハンドラを停止することはできません。現在のコードは、間隔またはタイムアウトの実行を停止しません。デモ:jsfiddle.net/skibulk/wdxrtvus/1あなたは修正としてこれを検討するかもしれない:stackoverflow.com/a/8860203/6465140
skibulk

73

「exit」関数は通常、パラメータまたはエラーメッセージとともにプログラムまたはスクリプトを終了します。たとえば、phpのdie(...)

die("sorry my fault, didn't mean to but now I am in byte nirvana")

JSでこれに相当するのは、次のようなthrowキーワードでエラーを通知することです。

throw new Error();

これは簡単にテストできます。

var m = 100;
throw '';
var x = 100;

x
>>>undefined
m
>>>100

46
@Sydwell:キャッチブロックで囲むと、キャッチされてプログラムが終了せず、ここでのポイントを無視します。
最終的な

4
エラーにメッセージを追加できることを忘れないでください:throw new Error( 'variable =' + x); 作業中にスクリプトをすばやく終了し、変数の値を取得するのに便利な方法です。
Andrew Swift

1
@ultimate #Sydwell mentはスクリプト全体をtry / catchでラップするため、a)クリーンな終了b)必要なときに例外メッセージが表示される可能性があると思います:)未処理の例外をスローしても、通常は効果がありません:)
jave.web

47

ハンドルやイベントなどのない単純なプログラムでも、それが唯一のプロシージャである場合でも、コードを「メイン」関数に配置するのが最善です。

<script> 
function main()
{
//code

}
main();
</script>

このように、プログラムを停止したい場合は、「return」を使用できます。


15

あなたがそれがエラーであることを気にしないなら、ただ書いてください:

fail;

これにより、メイン(グローバル)コードの処理が停止します。デバッグ/テストのいくつかの側面に役立ちます。


1
window.fail現在のブラウザでは定義されていません。
mikemaccana

7
それがポイントです-あなたがすることもできますmikeyMouse;-エラーは終了します。それは速くて汚い。
Marc

1
十分に公正です-おそらくあなたの答えにそれを追加してください?
mikemaccana

13

JSまたはNodeスクリプトを終了するには多くの方法があります。最も関連性の高いものは次のとおりです。

// This will never exit!
setInterval((function() {  
    return;
}), 5000);

// This will exit after 5 seconds, with signal 1
setTimeout((function() {  
    return process.exit(1);
}), 5000);

// This will also exit after 5 seconds, and print its (killed) PID
setTimeout((function() {  
    return process.kill(process.pid);
}), 5000);

// This will also exit after 5 seconds and create a core dump.
setTimeout((function() {  
    return process.abort();
}), 5000);

REPLを使用している場合(つまりnode、コマンドラインで実行した後)、入力.exitして終了できます。


私はそれをグーグルすることの最初の結果として現れる頭字語を説明することによって読者の知性を侮辱したくありませんでした。JavaScriptコードとREPLコマンドを混在させないことをお勧めします。ユーザーがそのコードブロックをコピー/貼り付けして実行すると、「。exit」行で構文エラーが発生するためです。
Dan Dascalescu 2018


5

debugger;実行を停止するJavaScriptコードにキーワードを配置します。次に、お気に入りのブラウザの開発者ツールを開いて、ページをリロードします。これで自動的に一時停止するはずです。ツールの[ ソース]セクションを開きます。debugger;キーワードが強調表示され、スクリプトの実行を再開するオプションがあります。

お役に立てば幸いです。

詳細については:


2

私はこの質問が回答されていると思い、クリックここで詳細は。以下はそれが投稿された短い答えです。

throw new Error("Stop script");

ブラウザを使用してブレークポイントを追加することもできます。すべてのブラウザは同様です。以下のブラウザの情報を確認してください。

クロームブレークポイント情報]の順にクリックし、ここで
Firefoxのブレークポイントの情報についてはクリックしてくださいここで
エクスプローラのブレークポイントの情報についてクリック
Safariのブレークポイント情報をクリックするためにここに


1

ページ上のすべてのJavascriptの実行を強制的に終了する方法を探している場合、それを行うための公式に認可された方法があるかどうかはわかりません。正直言って、頭の上から外れるとは思えない)。通常、JavaScriptでコードの実行を停止する場合returnは、実行中の関数から実行します。(returnそれが関数の最後のものであり、関数が値を返すべきではない場合、ステートメントはオプションです)返るだけでは十分ではない理由がある場合、なぜあなたが考える理由についての質問に詳細を編集する必要がありますあなたはそれを必要とし、おそらく誰かが別の解決策を提供することができます。

実際には、ほとんどのブラウザのJavascriptインタプリタは、エラーが発生した場合、現在のスクリプトの実行を単に停止することに注意してください。したがって、設定されていない変数の属性にアクセスするようなことができます:

function exit() {
    p.blah();
}

そして、おそらくスクリプトを中止します。しかし、それはまったく標準的ではないので、あなたはそれを当てにすべきではありません、そしてそれは本当にひどい習慣のように思えます。

編集:わかりました、多分これはアラフラのものに照らしてそれほど良い答えではありませんでした。die()彼がリンクした関数は基本的に私の2番目の段落を実装しますが、つまりエラーをスローするだけです。


1
そうすることで、現在実行中のスクリプトが停止します。新しいイベントが発生してスクリプトの新しい部分が実行されるのを妨げることはありません。
andynormancx 2009

言うまでもなく、エラーをスローするために特別な悪い関数は必要ありません。JavaScriptには、throwステートメントが組み込まれています。
クリス

die関数は、p.blah()よりも多くの機能を実行します。Windowsイベントを実行し、それらが持つハンドルを「e.preventDefault(); e.stopPropagation();」に置き換えます。これにより、イベントの発生が停止します。次に、例外をスローします。
andynormancx 2009

1

""をスローします。

コンセプトの誤用ですが、おそらく唯一の選択肢です。そして、はい、受け入れられた回答が言及するように、すべてのイベントリスナーをリセットする必要があります。私が正しい場合は、単一のエントリポイントも必要です。

その上に:スローされるとすぐに電子メールで報告するページが必要です。たとえば、Raven / Sentryを使用できます。しかし、それはあなた自身が偽陽性を生み出すことを意味します。そのような場合、デフォルトのハンドラーを更新して、そのようなイベントをフィルターで除外するか、Sentryのダッシュボードで無視するように設定する必要があります。

window.stop();

これは、ページのロード中は機能しません。ページのデコードも停止します。したがって、実際にそれを使用して、JavaScriptを使用しないページのバリアントをユーザーに提供することはできません。

デバッガ;

デバッガーが開いているときにのみ実行を停止します。うまく機能しますが、成果物ではありません。


1

JavaScriptには複数の方法がありますが、以下はその一部です

方法1:

throw new Error("Something went badly wrong!");

方法2:

return;

方法3:

return false;

方法4:

new new

方法5:

上記のメソッドを使用してカスタム関数を記述し、必要な場所で呼び出します

注: コードの実行を一時停止するだけの場合は、

debugger; 

0

この小さな関数は、PHPのexit()によく似ています。他のソリューションと同様に、他に何も追加しないでください。

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit

0

BOOL条件を作成するだけで、複雑なコードは必要ありません。

一度trueまたは複数回にすると、両方とも1行の解決策を提供します。複数ではなく、基本的には単純です。


0

スクリプトで未定義の関数を使用すると、「Uncaught ReferenceError」のためにスクリプトが停止します。私は次のコードを試してみましたが、最初の2行が実行されました。

これはスクリプトを停止する最良の方法だと思います。他の方法がある場合は、コメントしてください。また、別の最良かつ簡単な方法を知りたいです。ところで、私はスクリプトを終了するために、PHPのようなJavascriptでexitや組み込みの関数を取得しませんでした。誰かが知っているなら、私に知らせてください。

alert('Hello');

document.write('Hello User!!!');

die();  //Uncaught ReferenceError: die is not defined

alert('bye');

document.write('Bye User!!!');

0

エラーを「スロー」せずにさらにコードを実行しないwindow.onerrorようにする場合は、次のように一時的にオーバーライドできますcross-exit

function exit(code) {
    const prevOnError = window.onerror
    window.onerror = () => {
        window.onerror = prevOnError
        return true
    }

    throw new Error(`Script termination with code ${code || 0}.`)
}

console.log("This message is logged.");
exit();
console.log("This message isn't logged.");

0

私はiobrokerを使用しており、スクリプトを簡単に停止できます

stopScript();

0

ほとんどの状況には当てはまりませんが、ブラウザーで多数の非同期スクリプトを実行していたため、ハッキングとして

window.reload();

すべてを停止します。


0

私はこれが古いことを知っていますが、同様のPHP die()関数が必要な場合は、次のようにできます。

function die(reason) {
    throw new Error(reason);
}

使用法:

console.log("Hello");
die("Exiting script..."); // Kills script right here
console.log("World!");

上記の例では、「Hello」のみが出力されます。


-1

このコードを使用して実行を停止します。

throw new FatalError("!! Stop JS !!");

ただし、コンソールエラーが表示されますが、私には問題ありません。


-2

これは、条件が存在する場合にスクリプトを終了する例です。これをSSEクライアント側のJavaScriptで使用します。

<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>

JSON解析から直接解析できません...

if( ! SSE_HOST  ) throw new Error(['[!] SSE.js: ERR_NOHOST - finished !']);

...とにかく一般的な考え方は:

if( error==true) throw new Error([ 'You have This error' ,  'At this file', 'At this line'  ]);

これはあなたのjavasriptスクリプトを終了/死にます


1
これは実際には質問の答えにはなりません。彼らは一般的な問題について話しており、特定のSSE変数/ファイルとは関係ありません。
mjk 2017年

1
mjk-今すぐ良いですか?
kapad 2017年

-3

スローはコンソールでエラーになるので、スローではなくリターンステートメントを使用します。それを行う最良の方法は、状態を確認することです

if(condition){
 return //whatever you want to return
}

これは、コンソールにエラーを表示するのではなく、その行からプログラムの実行を停止するだけです。


1
ただし、「関数の外で 'return'を使用することはできません」というエラーがリンターに表示されます
Carles Alcolea

ステートメントが無効であるため、実行を停止します。if (condition) { new new }またはを使用することもできますif (condition) { purpleMonkeyDishwasher(); }
Coderer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.