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

102

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

купакоб
источник
2
см. это: stackoverflow.com/questions/550574/…
Стефита 01
«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, но он короче для ввода в целях отладки.)

Brilliand
источник
Использование пользовательского неопределенного идентификатора очень креативно! Мне нравится, насколько 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, не так ли?

Nourdine
источник
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> 
Regulus
источник
2

В JS нет функции exit, эквивалентной php die (), если вы не используете какую-либо функцию, вы можете просто использовать return;

return;
Ману Джозеф
источник
1

вы можете попробовать:

return 0;

которые работают в случае остановки процесса.

Мохаммед Ясин ЧАБЛИ
источник
0

Вы можете использовать return false; Это остановит ваш скрипт.

Bugfixer
источник
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>
арима
источник