PHPのダイに相当するJavaScript


100

JavaScriptに「死ぬ」のようなものはありますか?私は「ブレーク」で試しましたが、うまくいきません:)



「goto」のような「die」は、構造化プログラミングに準拠していません。これらのタイプの指示は、深刻なプロジェクトには使用しないでください。 en.wikipedia.org/wiki/Structured_programming
Adrian Maire、

3
function die(str) {throw new Error(str || "Script ended by death");}または何かXDそこに多くのより良いオプションがありますが、これはうまくいくでしょう。スクリプトの最初の部分だけを実行して機能することを確認する場合は、デバッグに適している可能性があります。
Niet the Dark Absol 2013年

@stefitaなぜあなたのコメントは回答に含まれていないのですか?exit()は私が必要とするものでした。もう1つの方法は、自動呼び出しループを実行し、1599回実行してから実行を停止することです。どうも。
m3nda 2015

@AdrianMaireあなたの心は正しい場所にありますが、質問の「なぜ」は問題ではありません。悪diegotoeval、などが延々と特に低レベルのデバッグのために、逆流(およびないメリットなし)、それらはすべて彼らの特別な用途があります。そうでなければ、言語はそれらを含みません。この場合、JSの同等物returnとはthrow無害十分です。
Beejor

回答:


34

breakラベルを付ける場合は、ブロックスコープのみを使用できます。例えば:

myBlock: {
  var a = 0;
  break myBlock;
  a = 1; // this is never run
};
a === 0;

スコープ内の関数内からブロックスコープを解除することはできません。つまり、次のようなことはできません。

foo: { // this doesn't work
  (function() {
    break foo;
  }());
}

関数でも同様のことができます:

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}

5
私は、ブロックスコープにラベルを付けることについて、ブロックスコープを書くことについてはあまり知りませんでした。それfoo: {}がオブジェクトであることを意味しますか?
2012年

3
いいえ。これはブロックスコープです。それは同じですfoo: if(true){...}
イーライグレイ

「スコープ内の関数内からブロックスコープを分割する」ことができないため、他に方法はありますか?
haykam

207
throw new Error("my error message");

7
これは完全に答えであり、die()と同じように機能します。ただし、firebugの赤い「1エラー」を気にする必要はありません。
Alexar 2010

3
PHPに同等の「firebug」がある場合、die()にも「1エラー」と書き込む必要があると思います;-)良い答えです。
Adrian Maire、2013

1
IE8で警告ダイアログボックスが表示されないのですか?
sbichenko 2013

PHPも例外をキャッチしていないため、1対1の同等ではありません。
ブリリアント

これは、完全に実行中のAFAIKを停止するのではなく、おおよそのスローの周りでのみ停止します。詳細は非常にぼやけていますが、スクリプトが別の場所で実行を継続できると確信しています。
2016年

22

あなたは単にreturn;例を使うことができます

$(document).ready(function () {
        alert(1);
        return;
        alert(2);
        alert(3);
        alert(4);
});

戻り値は、メインの呼び出し元関数test1();に戻ります。そこからtest3()に進みます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
function test1(){
    test2();
    test3();
}

function test2(){
    alert(2);
    return;
    test4();
    test5();
}

function test3(){
    alert(3);
}

function test4(){
    alert(4);
}

function test5(){
    alert(5);
}
test1();

</script>
</body>
</html>

しかし、スローを追加するだけの場合 ''; これにより、エラーが発生することなく実行が完全に停止します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
function test1(){
    test2();
    test3();
}

function test2(){
    alert(2);
    throw '';   
    test4();
    test5();
}

function test3(){
    alert(3);
}

function test4(){
    alert(4);
}

function test5(){
    alert(5);
}
test1();

</script>
</body>
</html>

これは、firefoxとchromeでテストされています。これがIEまたはSafariでどのように処理されるのかわかりません


2
私の知るreturn限り、囲んでいる関数のみを終了します。スクリプト全体の実行を停止する場合は機能しません。
アンドレ・Leria

1
ええ、そうです、すべてのスクリプトの実行を停止するわけではありません。
themhz 2013

throw ""...すべてのエラーを起こすことなく、... -未かなり...Uncaught ""
FZS

15

die()定義せずに呼び出すだけです。スクリプトがクラッシュします。:)

私がこれをするとき、私は通常discombobulate()代わりに呼びますが、原理は同じです。

(実際には、これはをスローするReferenceErrorので、spudlyの答えとほぼ同じになりますが、デバッグの目的で入力する方が短くなります。)


カスタムの未定義の識別子の使用は非常に創造的です!die直感的で簡潔な方法が好きです。throw特定のエラーメッセージをログに記録することには利点がありませんが、行番号だけで十分な場合もあります。ところで、die;括弧なし(un-)も機能します。
Beejor

または単に死ぬ; JavaScriptを停止したい行。
MarcoZen 2017

この答えはJSを気にしています^^機能しても汚れていません!
Yonn Trimoreau

7

独自のバージョンのPHPのサイコロを振ることができます。

function die(msg)
{
    throw msg;
}

function test(arg1)
{
    arg1 = arg1 || die("arg1 is missing"); 
}

test();

JSFiddleの例


これはのような場合には機能しないことを述べておきたいと思いvar a = arguments[3] || die('message')ます。代わりに、私は死ぬべきだと思います:function die(msg) { return eval(`throw "${msg}"`);)しかし、それでも、エラーがどの行が失敗したかを示すように、分割する行にこれをハードに配置する必要があると思います。例: this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

多分、私があなたを理解しているなら、eval()が問題を解決するかどうかはわかりません。障害が実際に発生している場所に関心がある場合は、スタックトレースを確認するのが理想的です。それ以外の場合は、単にユーザーに何らかの基本的なエラーメッセージを報告したいと考えるのが安全だと思います。
ケルマー

7

nodejsを使用している場合は、

process.exit(<code>);

4
これがnode.jsに関するものである場合、質問のタグはnode.js
FelixSFD

3
@FelixSFD:それでも、タグを完全に無視してこれを正確に探していたので、それは私に役立ちました;)
DE

3

firebugと栄光の使用...

debugger;

デバッガーが前進しないようにしてください。適切なErrorinnitを投げるよりもクリーンですか?


2
まったく同じではありません!
Rolf

2

Javascriptにdieは、PHP の言語構造と完全に一致するものはありません。PHPでほとんど等しいですにおけるJavaの現在のスクリプトを終了してシャットダウンフックを呼び出し、。一部のユーザーが示唆したように; 場合によっては使用できますが、現在のスクリプトの終了を保証することはできません。ステートメントを囲む例外処理ブロックが常に存在する可能性があります- 最上位レベルのスクリプトブロックでそれを呼び出し、最終的に実行中のスクリプトブロックのみを終了する場合を除きます。dieSystem.exit()throw Errorthrow

ただし、2番目のブロックがここで実行されるのを防ぐことはできません(helloを出力します)。

<script type="text/javascript">
  throw new Error('test');
</script>
<script type="text/javascript">
  document.write("hello");
</script> 


1

JSにはphp die()に相当する関数出口はありません。関数を使用していない場合は、単にreturnを使用できます。

return;

0

return falseを使用できます。これでスクリプトが終了します。


3
おそらく、トップレベルのみです。PHPのdie()は任意のレベルで呼び出すことができ、PHPインタープリターがすぐに消えてしまいます。
Rolf

0

これは、die()のような作業になるはずです。

function die(msg = ''){
    if(msg){
        document.getElementsByTagName('html')[0].innerHTML = msg;
    }else{
        document.open();
        document.write(msg);
        document.close();
    }
    throw msg;
}

0

開発目的のグローバルなdie()関数:

var die = function(msg) {
    throw new Error(msg);
}

die()を使用します。

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.