JavaScript相当于PHP的死亡


100

JavaScript中是否有类似“死”的东西?我已经尝试过“ break”,但是不起作用:)



像“ goto”这样的“ die”不符合结构化编程。这些类型的说明绝对不能用于严肃的项目。 zh.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()正是我所需要的。另一种方法是运行一个自动调用循环,将运行1599次然后停止执行。谢谢。
m3nda 2015年

@AdrianMaire您的心在正确的地方,但是问题的“为什么”不应该引起争议。所带来的弊端diegotoeval,等被无休止地反刍(而不是没有道理),但他们都有自己的特殊用途,尤其是低级别的调试。否则,语言将不包括它们。在这种情况下,的JS当量returnthrow是无害的足够。
Beejor

Answers:


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){...}
Eli Gray

有没有其他选择,因为您不能“从范围内的函数中破坏块范围”?
haykam

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

7
这绝对是答案,并且就像die()一样工作;但是,您不应该在乎萤火虫的红色“ 1错误”!
Alexar

3
我认为,如果PHP具有等效的“ firebug”,它也应该在die();-)上写“ 1 error” ;-)好答案!
Adrian Maire

1
这不会在IE8中产生警告对话框吗?
sbichenko 2013年

它不是一对一的等效项,因为PHP也有未捕获的异常。
Brilliand 2014年

这不会完全停止执行AFAIK,而只会大致停止。具体细节非常模糊,但是我很确定脚本可以继续在其他地方运行。
罗尔夫

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>

但是如果您只添加throw''; 这将完全停止执行而不会引起任何错误。

<!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
嗯,是的,这不会停止所有脚本的执行。
2013年

throw ""...没有引起任何错误...-不完全是Uncaught ""
FZ

15

只需调用就die()无需定义它。您的脚本将崩溃。:)

当我这样做时,我通常会打电话给我discombobulate(),但是原理是一样的。

(实际上,这样做是抛出a ReferenceError,使其与spudly的答案大致相同-但出于调试目的,它的键入较短。)


使用自定义的未定义标识符非常有创意!我喜欢die直观而简洁的方式。它确实缺少throw记录特定错误消息的好处,但是有时仅行号就足够了。顺便说一句,die;没有括号(取消)也可以。
Beejor 2015年

或只是死 在您希望JavaScript停止的那一行。
MarcoZen

这个答案让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 2016年

3
@FelixSFD:仍然对我有所帮助,因为我一直在搜索,完全不考虑标签;)
DE

3

使用萤火虫和光荣的...

debugger;

永远不要让调试器前进任何一步。比扔适当的东西还要Error干净?


2
不完全一样!
罗尔夫

2

dieJavascript中,PHP 的语言构造没有确切的对等之处。diePHP System.exit()中的JavaJava中的Java几乎相等,后者终止当前脚本并调用shutdown钩子。正如一些用户所建议的;throw Error在某些情况下可以使用,但是它不能保证当前脚本的终止。throw语句周围总会有一个异常处理块- 除非您在最顶层的脚本块上调用它,否则最终只会退出您正在执行的脚本块。

但是,这不会阻止第二个块在这里执行(打印你好):

<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()函数:

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.