web-dev-qa-db-ja.com

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

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

117
Nir

PHPのdieに相当するJavaScript 。ところでそれは 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 '';
}
72
Ólafur Waage

「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
57
Lorenz Lo Sauer

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

<script> 
function main()
{
//code

}
main();
</script>

この方法では、プログラムを停止するときに「return」を使用できます。

44
Jhep

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と入力して終了できます。

8
not2qubit

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

fail;

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

6
Marc

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

役に立てば幸いです。

詳細情報:

3
rbelow

この回答では、モジュラーjavascriptでのこのおよびその他の早期終了、例外、プロセス制御、シーケンシャル関数処理のニーズを解決するのに役立つ追加のフレームワークを示す詳細を提供します。ソリューションは閉鎖の例を提供します。この回答は、個人が、問題のスクリプトが終了した後もページ上の他のスクリプトを実行し続けることを望んでいることを前提としています。

ここでの簡単なソリューションの実例: https://codepen.io/corpus_khu/pen/VpMQzO

<script>
    var safetyRun = (function(){
      var curExecution = null;
      var exceptionHandlers = {
        cleanup:function(){
          /*do exit cleanup*/
          console.log("Cleanup could set straglers to {}");
          return;
        }
      }
      var exitErr = function(errcode){
        curExecution.exNames.Push("cleanup");
        throw new Error("EarlyExit");
      }
        var run = function(fun){
          curExecution = this;
          curExecution.exNames = [];
          fun(exitErr);
          for ( x in exNames){
            exceptionHandlers[x]();
          }
          return;
        }
        return run;
    })();
    var exitThisScript = function(exit){
      //write some modular code
      console.log("before exit");
      exit();
      console.log("after exit");
      return;
    }
    safetyRun(exitThisScript);
</script>

上記は非常に簡単な終了方法です。この「ランナー」に関数を送信する前に、ハーネスをロードして実行できるオブジェクトでラップすることにより、テストハーネスで関数をラップすることをお勧めします。テストハーネスは、exit()などのメソッドを関数に公開して、合格する。

適切な終了戦略を構築するために必要なすべての例は、githubで入手できます(ファイル:pseudo_threads2.js): https://github.com/fromSpace/js-recursionwithevents-practice

ライブデモバージョンはこちら: https://fromspace.github.io/js-recursionwithevents-practice/

Pseudo_threads2.jsでは、関数simConstantMomentum()が、すべてのハーネス関数を持つレキシカルスコープvarsを持つ関数を返すことに注意してください。代わりに、この関数の上部でハーネスジェネレーターを呼び出し、その結果をローカル変数に割り当てることをお勧めします。これにより、終了したい関数が終了時にこのようになります。

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){
        harness.scriptContextChangeEvent();
        harness.imInteligentFunction("{slib_err-15346 : 'Cannot handle request, ::suggest(mesh//abc) exit back to pool'}");
        harness.exit();
        console.log("You should never get this far");
        return true;
    };
}

ここで提供したソリューションは、exit、assert、mockなどの機能を備えたjavascriptランナーコンテナを構築することを意図している場合にお勧めです。このコンテナシップを構築し、送信可能な機能。 -corpus_khu

1
Shawn N Stark

私の場合、ブラウザのXボタンをクリックするようなAPI window.stop を使用しました。

window.stop();
1
Musa

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

一度それをtrue /または複数回回しても、両方とも1行のソリューションを提供します/複数ではなく-基本的にそれは単純です。

0
moni

スクリプトで未定義の関数を使用すると、「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
npsingh

この質問には答えられていると思います。詳細については、 here をクリックしてください。以下は、掲載されている短い回答です。

throw new Error("Stop script");

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

Chromeブレークポイント情報については、 here をクリックしてください。
Firefoxのブレークポイント情報については、 こちら をクリックしてください。
エクスプローラーのブレークポイント情報 クリック
Safariのブレークポイント情報については、 こちら をクリックしてください。

0
alfmonc

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

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

「」を投げます。

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

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

window.stop();

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

デバッガ;

デバッガを開いた状態でのみ実行を停止します。うまく機能しますが、成果物ではありません。

更新:これはcatchをしない限り機能します!

throw window.location.assign('dead.html');
0
Dylan Sharhon

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

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

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

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

EDIT:OK、たぶん、これはÓlafurの観点からはあまり良い答えではなかったでしょう。彼がリンクしたdie()関数は基本的に私の2番目の段落を実装していますが、それは単にエラーを投げるだけです。

0
David Z