JavaScript-еквівалент відмирання PHP


100

Чи є щось на кшталт "die" в JavaScript? Я намагався з "перервою", але не працює :)



"die", як "goto", не відповідають структурованому програмуванню. Ці типи інструкцій ніколи не повинні використовуватися для серйозних проектів. 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

@stefita Чому ваш коментар не відповідає у відповідях ?? вихід () був саме тим, що мені потрібно. Інший спосіб - запустити цикл автоматичного виклику, запустити 1599 разів, а потім зупинити виконання. Дякую.
м3нда

@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: {}це об’єкт?
чаруйте

3
Ні. Це блокова область. Це те саме, щоfoo: if(true){...}
Елі Сірий

Чи є альтернатива, оскільки ви не можете "зламати область блоку з функції в області"?
хайкам

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

7
це абсолютно відповідь і працює так само, як die (); проте не слід дбати про червону "1 помилку" firebug!
Алексар

3
Я думаю, що якщо PHP має еквівалент "firebug", він також повинен написати "1 помилку" на die () ;-) Гарна відповідь!
Адріан Мейр

1
Чи не створить це діалогове вікно попередження в IE8?
sbichenko

Не еквівалент 1 на 1, оскільки PHP теж має виняткові винятки.
Brilliand

Це не призведе до повного припинення виконання AFAIK, а лише приблизно до кидка. Особливості дуже розмиті, але я впевнений, що сценарій може продовжувати працювати десь в іншому місці.
Рольф

22

Можна просто використовувати return;приклад

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

Повернення повернеться до тесту основної функції виклику1 (); і продовжуйте звідти до 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 та хромом. Я не знаю, як це справляється з IE або Safari


2
Наскільки мені відомо, returnвиходить лише функція, що вкладається. Це не працює, коли ви хочете зупинити виконання всього сценарію.
Андре Лерія

1
хммм так, ви праві, це не зупиняє виконання всього сценарію.
themhz

throw "": ... не викликаючи жодних помилок ... - Не зовсім ...Uncaught ""
FZs

15

Просто зателефонуйте, die()не визначаючи цього. Ваш сценарій вийде з ладу. :)

Коли я це роблю, я зазвичай discombobulate()натомість дзвоню , але принцип той же.

(Насправді, це робиться як кидок ReferenceError, що робить це приблизно так само, як відповідь spudly - але це коротше набирати, для налагодження.)


Використання користувацького невизначеного ідентифікатора дуже творче! Мені подобається, наскільки dieінтуїтивно та стисло. Не вистачає користі, throwколи мова заходить про реєстрацію конкретного повідомлення про помилку, але іноді достатньо лише номера рядка. До речі, die;без дужок (без) теж працює.
Beejor

або просто померти; на лінії, де ви хочете, щоб ваш javascript зупинився.
MarcoZen

Ця відповідь так налаштована на JS ^^ Це не брудно, якщо це працює!
Іон Триморе

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."');
Дмитро

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

7

Якщо ви використовуєте nodejs, ви можете використовувати

process.exit(<code>);

4
Якщо мова піде про node.js, запитання матиме тег node.js
FelixSFD

3
@FelixSFD: Все-таки це допомогло мені, коли я шукав саме це, повністю ігноруючи теги;)
DE

3

використовуйте firebug та славну ...

debugger;

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


2
Не зовсім те саме!
Рольф

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> 


1

У JS немає виходу функції, еквівалентного php die (), якщо ви не використовуєте жодну функцію, ви можете просто використовувати return;

return;

0

Ви можете використовувати false false; Це припинить ваш сценарій.


3
Тільки на верхньому рівні, імовірно. PHP die () можна викликати на будь-якому рівні і призведе до того, що інтерпретатор PHP піде прямо туди.
Рольф

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.