JavaScript odpowiednik kostki PHP


100

Czy w JavaScript jest coś takiego jak „umrzeć”? Próbowałem z „przerwą”, ale nie działa :)



„die”, jak „goto”, nie są zgodne z programowaniem strukturalnym. Tego typu instrukcji nigdy nie należy używać w przypadku poważnych projektów. en.wikipedia.org/wiki/Structured_programming
Adrian Maire

3
function die(str) {throw new Error(str || "Script ended by death");}Lub coś XD Mnóstwo lepszych opcji, ale to zadziała. Może być dobry do debugowania, jeśli chcesz uruchomić tylko pierwszą część skryptu, aby upewnić się, że działa.
Niet the Dark Absol

@stefita Dlaczego w odpowiedziach nie ma Twojego komentarza? exit () było właśnie tym, czego potrzebuję. Innym sposobem jest uruchomienie pętli autocall, zostanie uruchomiona 1599 razy, a następnie zatrzyma wykonywanie. Dzięki.
m3nda

@AdrianMaire Twoje serce jest na właściwym miejscu, ale pytanie „dlaczego” nie powinno być problemem. Zło die, goto, eval, itd. Są nieskończenie regurgitated (i nie bez zasługi), ale wszystkie one mają swoje szczególne zastosowanie, zwłaszcza dla niskiego poziomu debugowania. Inaczej języki by ich nie obejmowały. W tym przypadku odpowiedniki JS returni throwsą wystarczająco nieszkodliwe.
Beejor

Odpowiedzi:


34

Zasięg breakblokowy można uzyskać tylko wtedy, gdy go opatrzysz etykietą. Na przykład:

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

Nie można przerwać zakresu blokowego z poziomu funkcji w zakresie. Oznacza to, że nie możesz robić takich rzeczy jak:

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

Możesz zrobić coś podobnego z funkcjami:

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

5
Nigdy nie wiedziałem o etykietowaniu zakresu blokowego, a tym bardziej pisaniu zakresu blokowego. Czy to oznacza, że foo: {}jest to przedmiot?
enchance

3
Nie. To zakres blokowy. To to samo, cofoo: if(true){...}
Eli Gray

Czy jest jakaś alternatywa, skoro nie można „zerwać zakresu blokowego z funkcji w zakresie”?
haykam

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

7
to jest absolutna odpowiedź i działa tak jak die (); jednak nie należy przejmować się czerwonym „1 Error” firebuga!
Alexar

3
Myślę, że jeśli PHP ma odpowiednik "firebug" to powinien również napisać "1 błąd" na die () ;-) Dobra odpowiedź!
Adrian Maire

1
Czy to nie spowoduje wyświetlenia okna dialogowego z ostrzeżeniem w IE8?
sbichenko

Nie jest to odpowiednik 1 do 1, ponieważ PHP ma również nieprzechwycone wyjątki.
Brilliand

Nie zatrzyma to całkowicie wykonania AFAIK, ale tylko z grubsza wokół rzutu. Szczegóły są bardzo niewyraźne, ale jestem prawie pewien, że skrypt może działać gdzie indziej.
Rolf

22

Możesz po prostu skorzystać z return;przykładu

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

Zwrot wróci do głównej funkcji wywołującej test1 (); i kontynuuj stamtąd do 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>

ale jeśli dodasz tylko rzut ''; spowoduje to całkowite zatrzymanie wykonywania, nie powodując żadnych błędów.

<!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>

Jest to testowane z przeglądarkami Firefox i Chrome. Nie wiem, jak radzi sobie z tym IE lub Safari


2
O ile wiem, returnwychodzi tylko z funkcji otaczającej. Nie działa, gdy chcesz przerwać wykonywanie całego skryptu.
André Leria

1
hmmm tak, masz rację, to nie zatrzymuje wykonywania całego skryptu.
themhz

throw "": ... bez powodowania błędów ... - Niezupełnie ...Uncaught ""
FZ

15

Po prostu zadzwoń die()bez definiowania tego. Twój skrypt ulegnie awarii. :)

Kiedy to robię, zwykle dzwonię discombobulate(), ale zasada jest taka sama.

(Właściwie to rzuca a ReferenceError, dzięki czemu jest mniej więcej taki sam jak odpowiedź Spudly - ale jest krótszy do wpisania do celów debugowania.)


Użycie niestandardowego niezdefiniowanego identyfikatora jest bardzo twórcze! Podoba mi się, jak diejest intuicyjne i zwięzłe. Brakuje mu korzyści, throwjeśli chodzi o rejestrowanie określonego komunikatu o błędzie, ale czasami wystarczy tylko numer linii. BTW, die;bez nawiasów (nie-) też działa.
Beejor

albo po prostu umrzyj; w linii, w której chcesz zatrzymać JavaScript.
MarcoZen

Ta odpowiedź jest taka zorientowana na JS ^^ Nie jest brudne, jeśli działa!
Yonn Trimoreau

7

Możliwe jest zrobienie własnej wersji kości PHP:

function die(msg)
{
    throw msg;
}

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

test();

Przykład JSFiddle


Chciałem wspomnieć, że to nie zadziała w takich przypadkach jak var a = arguments[3] || die('message'). zamiast tego myślę, że umrzeć powinno być: function die(msg) { return eval(`throw "${msg}"`);)ale nawet wtedy myślę, że powinno to być po prostu mocno postawione na linii, która się łamie, aby błąd wskazywał, która linia zawiodła, np. this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

Prawdopodobnie nie wiem, czy eval () rozwiązuje problem, jeśli cię rozumiem. Idealnie byłoby spojrzeć na ślad stosu, gdybyś był zainteresowany tym, gdzie faktycznie występuje awaria. W przeciwnym razie myślę, że można bezpiecznie założyć, że chcesz po prostu zgłosić użytkownikowi jakiś podstawowy komunikat o błędzie.
Kelmar

7

Jeśli używasz nodejs, możesz użyć

process.exit(<code>);

4
Gdyby chodziło o node.js, pytanie miałoby tag node.js
FelixSFD

3
@FelixSFD: Mimo to pomogło mi to, ponieważ szukałem dokładnie tego, całkowicie ignorując tagi;)
DE

3

użyj ognistego robaka i wspaniałego ...

debugger;

i nigdy nie pozwól debugerowi zrobić żadnego kroku do przodu. Czystsze niż rzucanie prawdziwego Errorinnit?


2
Nie dokładnie to samo!
Rolf

2

Nie ma dokładnego odpowiednika konstrukcji języka diePHP w JavaScript . diew PHP jest prawie taki sam jak System.exit()w Javie , który przerywa bieżący skrypt i wywołuje zaczepy zamykające. Jak sugerowali niektórzy użytkownicy; throw Errormoże być używany w niektórych przypadkach, jednak nigdy nie gwarantuje to zakończenia bieżącego skryptu. Zawsze może istnieć blok obsługi wyjątków otaczający throwinstrukcję - chyba że wywołasz ją w bloku skryptu najwyższego poziomu, który ostatecznie zamyka tylko wykonywany blok skryptu.

Jednak nie zapobiegnie to wykonaniu drugiego bloku tutaj (wypisuje hello):

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


1

Nie ma funkcji exit równoważnej php die () w JS, jeśli nie używasz żadnej funkcji, możesz po prostu użyć return;

return;

0

Możesz użyć funkcji return false; Spowoduje to zamknięcie skryptu.


3
Przypuszczalnie tylko na najwyższym poziomie. Funkcja die () PHP może zostać wywołana na dowolnym poziomie i spowoduje od razu przejście interpretera PHP.
Rolf

0

To powinno działać jak die ();

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

0

Funkcja Global die () do celów programistycznych:

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

Użyj die ():

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.