Эквивалент гибели PHP в JavaScript


102

Есть ли в JavaScript что-то вроде «die»? Пробовал с "перерывом", но не получается :)



«die», как «goto», не подходят для структурного программирования. Эти типы инструкций никогда не следует использовать для серьезных проектов. en.wikipedia.org/wiki/Structured_programming
Адриан Мэйр,

3
function die(str) {throw new Error(str || "Script ended by death");}Или что-нибудь XD Есть много вариантов получше, но это сработает. Может быть полезно для отладки, если вы хотите запустить только первую часть скрипта, чтобы убедиться, что он работает.
Niet the Dark Absol

@stefita Почему в ответах нет вашего комментария ?? exit () был именно тем, что мне нужно. Другой способ - запустить цикл автовызова, он будет выполнен 1599 раз, а затем остановится. Спасибо.
m3nda

@AdrianMaire Твое сердце в нужном месте, но вопрос «почему» не должен быть проблемой. Зло die, goto, evalи т.д. бесконечно выплюнул (и не без заслуг), но все они имеют свои особые случаи применения, особенно при отладке низкого уровня. В противном случае языки не включали бы их. В этом случае эквиваленты 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: {}это объект?
enchance

3
Нет. Это блочный прицел. Это то же самое, чтоfoo: if(true){...}
Эли Грей

Есть ли альтернатива, поскольку вы не можете «разбить область видимости блока из функции в области видимости»?
haykam

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

7
это абсолютный ответ и работает так же, как die (); однако не следует беспокоиться о красной «1 ошибке» firebug!
Alexar

3
Я думаю, что если PHP имеет эквивалент «firebug», он также должен написать «1 ошибка» на die () ;-) Хороший ответ!
Адриан Мэйр,

1
Разве это не приведет к появлению диалогового окна с предупреждением в IE8?
сбиченко

Не эквивалент 1 к 1, поскольку в PHP тоже есть неперехваченные исключения.
Brilliand

Это не остановит выполнение полностью, AFAIK, а только примерно в районе броска. Детали очень расплывчаты, но я уверен, что сценарий может работать где-нибудь еще.
Rolf

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выходит только закрывающая функция. Это не сработает, если вы захотите прекратить выполнение всего скрипта.
Андре Лерия

1
хммм да вы правы, это не останавливает выполнение всего скрипта.
themhz

throw "": ... без ошибок ... - Не совсем ...Uncaught ""
FZs 02

15

Просто позвоните, die()даже не определив. Ваш скрипт выйдет из строя. :)

Когда я это делаю, я обычно звоню discombobulate(), но принцип тот же.

(На самом деле, то, что он делает, - это throw a ReferenceError, что делает его примерно таким же, как ответ spudly, но он короче для ввода в целях отладки.)


Использование пользовательского неопределенного идентификатора очень креативно! Мне нравится, насколько dieинтуитивно понятен и лаконичен. Ему не хватает преимуществ, throwкогда дело доходит до регистрации конкретного сообщения об ошибке, но иногда достаточно просто номера строки. Кстати, die;без круглых скобок (un-) тоже работает.
Beejor

или просто умереть; в строке, где вы хотите, чтобы ваш javascript остановился.
MarcoZen

Этот ответ настолько ориентирован на JS ^^ Это не грязно, если он работает!
Йонн Триморо

8

Если вы используете nodejs, вы можете использовать

process.exit(<code>);

4
Если бы речь шла о node.js, вопрос был бы с тегом node.js
FelixSFD

3
@FelixSFD: Тем не менее, это помогло мне, поскольку я искал именно это, полностью игнорируя теги;)
DE

7

Можно бросить свою собственную версию кубика PHP:

function die(msg)
{
    throw msg;
}

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

test();

Пример JSFiddle


Я хотел упомянуть, что это не сработает в таких случаях, как var a = arguments[3] || die('message'). вместо этого, я думаю, что die должно быть: function die(msg) { return eval(`throw "${msg}"`);)но даже тогда, я думаю, это должно быть просто жестко помещено в строку, которая разрывается, чтобы ошибка показывала, какая строка не удалась, например this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Дмитрий

Возможно, не уверен, что eval () решит проблему, если я вас понимаю. В идеале, если бы вы интересовались, где на самом деле произошел сбой, нужно было бы смотреть на трассировку стека. В противном случае я бы с уверенностью предположил, что вы просто хотите сообщить своему пользователю какое-то базовое сообщение об ошибке.
Kelmar

3

используйте firebug и славный ...

debugger;

и никогда не позволяйте отладчику сделать шаг вперед. Чище, чем подбрасывать Error, не так ли?


2
Не совсем то же самое!
Rolf

2

В Javascript нет точного эквивалента языковой конструкции diePHP . в PHP почти такой же, как в Java , которая завершает текущий скрипт и вызывает перехватчики выключения. Как предложили некоторые пользователи; может использоваться в некоторых случаях, однако никогда не гарантирует завершения текущего сценария. Вокруг вашего оператора всегда может быть блок обработки исключений - если вы не вызываете его в блоке сценария самого верхнего уровня, который в конечном итоге выходит только из блока сценария, который вы выполняете.dieSystem.exit()throw Errorthrow

Однако это не помешает выполнению второго блока здесь (печатает привет):

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

2

В JS нет функции exit, эквивалентной 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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.