PHP의 다이와 동등한 JavaScript


100

JavaScript에 "죽음"과 같은 것이 있습니까? 나는 "휴식"으로 시도했지만 작동하지 않습니다 :)



"goto"와 같은 "die"는 구조화 된 프로그래밍을 준수하지 않습니다. 이러한 유형의 지침은 심각한 프로젝트에 사용해서는 안됩니다. 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 왜 답변에 귀하의 의견이 없습니까 ?? exit ()는 내가 필요한 것입니다. 다른 방법은 자동 호출 루프를 실행하고 1599 번 실행 한 다음 실행을 중지하는 것입니다. 고마워.
m3nda

@AdrianMaire 귀하의 마음은 올바른 위치에 있지만 질문의 "이유"는 문제가되지 않아야합니다. 의 악 die, goto, eval, 등 끝없이 특히 낮은 수준의 디버깅을 위해, 역류 (그리고 공로없이), 그러나 그들은 모두 그들의 특별한 용도가 있습니다. 그렇지 않으면 언어에 포함되지 않습니다. 이 경우의 JS 당량 returnthrow무해한 충분하다.
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){...}
Eli Gray

"범위의 함수 내에서 블록 범위를 분리"할 수 없기 때문에 대안이 있습니까?
haykam

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

7
이것은 절대적으로 답이며 die (); 그러나 방화범의 빨간색 "1 오류"는 신경 쓰지 말아야합니다!
Alexar 2010

3
PHP에 "firebug"에 해당하는 것이 있다면 die ()에 "1 오류"라고 써야한다고 생각합니다 ;-) 좋은 대답입니다!
Adrian Maire 2013

1
IE8에서 경고 대화 상자가 생성되지 않습니까?
sbichenko

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둘러싸는 기능 만 종료합니다. 전체 스크립트 실행을 중지하려면 작동하지 않습니다.
André Leria 2013

1
흠 예, 맞습니다. 모든 스크립트의 실행을 중지하지 않습니다.
themhz apr

throw "": ... 오류를 일으키지 않고Uncaught ""
...-

15

die()정의하지 않고 전화 하십시오. 스크립트가 충돌합니다. :)

이렇게하면 보통 discombobulate()대신 부르지 만 원칙은 같습니다.

(사실, 이것이하는 일은을 던지는 ReferenceError것인데, 이는 거의 어리석은 대답과 거의 같지만 디버깅 목적으로 입력하는 것이 더 짧습니다.)


정의되지 않은 사용자 지정 식별자의 사용은 매우 창의적입니다! die직관적이고 간결한 방식 이 마음에 듭니다. throw특정 오류 메시지를 기록 할 때 의 이점이 부족 하지만 때로는 줄 번호만으로 충분합니다. die;괄호가없는 BTW (un-)도 작동합니다.
Beejor 2015-06-13

아니면 그냥 죽거나 자바 스크립트를 중지하려는 줄에서.
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'). 대신에, 저는 die가되어야한다고 생각합니다. function die(msg) { return eval(`throw "${msg}"`);)하지만 그렇다하더라도 이것이 끊어지는 줄에 딱딱하게 배치되어 오류가 어떤 줄이 실패했는지 보여 주어야한다고 생각합니다. 예 this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

아마도 eval ()이 당신을 이해하고 있다면 문제를 해결하지 못할 것입니다. 이상적으로는 실패가 실제로 발생하는 위치에 관심이 있다면 스택 추적을 살펴 보는 것입니다. 그렇지 않으면 단순히 사용자에게 일종의 기본 실패 메시지를보고한다고 가정하는 것이 안전하다고 생각합니다.
Kelmar

7

nodejs를 사용하는 경우 다음을 사용할 수 있습니다.

process.exit(<code>);

4
이것이 node.js에 관한 것이라면 질문에는 node.js
FelixSFD

3
@FelixSFD : 태그를 완전히 무시하고 정확히 검색 했으므로 여전히 도움이되었습니다.)
DE

3

방화범과 영광스러운 ...

debugger;

디버거가 앞으로 나아갈 수 없게하세요. 적절한 Error, innit를 던지는 것보다 더 깨끗합니까?


2
똑같지는 않습니다!
Rolf

2

Javascriptdie 에서 PHP 의 언어 구조 와 정확히 일치하는 것은 없습니다 . PHP에서 거의 동일한 것입니다 에서 자바 현재 스크립트를 종료하고 종료 후크를 호출합니다. 일부 사용자가 제안했듯이; 일부 경우에 사용할 수 있지만 현재 스크립트의 종료를 보장하지 않습니다. 명령문을 둘러싼 예외 처리 블록이 항상있을 수 있습니다. 최상위 스크립트 블록에서 호출하지 않는 이상 실행중인 스크립트 블록 만 종료됩니다.dieSystem.exit()throw Errorthrow

그러나 두 번째 블록이 여기에서 실행되는 것을 막지는 못합니다 (hello 인쇄).

<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 ();

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.