JavaScript equivalente ao dado do PHP

100

Existe algo como "morrer" em JavaScript? Já tentei com "break", mas não deu certo :)

cupakob
fonte
2
veja isto: stackoverflow.com/questions/550574/…
stefita 01 de
"die", como "goto" não são compatíveis com a programação estruturada. Esses tipos de instruções nunca devem ser usados ​​para projetos sérios. en.wikipedia.org/wiki/Structured_programming
Adrian Maire
3
function die(str) {throw new Error(str || "Script ended by death");}Ou algo XD. Muitas opções melhores por aí, mas funcionaria. Pode ser bom para depuração, se você quiser apenas executar a primeira parte de um script para ter certeza de que funciona.
Niet the Dark Absol,
@stefita Por que seu comentário não está nas respostas ?? exit () era exatamente o que eu precisava. A outra maneira é executar um loop de chamada automática, será executado 1599 vezes e, em seguida, parará a execução. THX.
m3nda
@AdrianMaire Seu coração está no lugar certo, mas o "porquê" de uma pergunta não deveria estar em questão. Os males da die, goto, eval, etc, são infinitamente regurgitado (e não sem mérito), mas todos eles têm seus usos especiais, especialmente para depuração de baixo nível. Caso contrário, os idiomas não os incluiriam. Nesse caso, os equivalentes JS de returne throwsão bastante inócuos.
Beejor

Respostas:

34

Você só pode breakbloquear um escopo se rotulá-lo. Por exemplo:

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

Você não pode quebrar um escopo de bloco de dentro de uma função no escopo. Isso significa que você não pode fazer coisas como:

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

Você pode fazer algo semelhante com funções:

function myFunction() {myFunction:{
  // you can now use break myFunction; instead of return;
}}
Eli Gray
fonte
5
Nunca soube rotular um escopo de bloco, muito menos escrever um escopo de bloco. Isso significa que foo: {}é um objeto?
enchance
3
Não. É um escopo de bloco. É o mesmo quefoo: if(true){...}
Eli Gray
Existe alguma alternativa, uma vez que você não pode "quebrar um escopo de bloco de dentro de uma função no escopo"?
haykam
207
throw new Error("my error message");
Stephen Sorensen
fonte
7
esta é absolutamente a resposta e funciona exatamente como die (); entretanto, não devemos nos preocupar com o "1 erro" vermelho do firebug!
Alexar
3
Eu acho que se o PHP tem um equivalente "firebug", ele também deve escrever "1 erro" no die () ;-) Boa resposta!
Adrian Maire
1
Isso não produzirá uma caixa de diálogo de aviso no IE8?
sbichenko
Não é um equivalente de 1 para 1, visto que o PHP também tem exceções não detectadas.
Brilliand
Isso não vai parar totalmente a execução AFAIK, mas apenas aproximadamente em torno do lançamento. Os detalhes estão muito confusos, mas tenho certeza de que o script pode continuar sendo executado em outro lugar.
Rolf
22

Você pode simplesmente usar o return;exemplo

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

O retorno retornará para a função principal do chamador test1 (); e continue daí para 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>

mas se você apenas adicionar throw ''; isso interromperá completamente a execução sem causar erros.

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

Isso é testado com firefox e cromo. Não sei como isso é tratado pelo IE ou Safari

themhz
fonte
2
Pelo que eu sei, returnsai apenas da função de fechamento. Não funciona quando você deseja interromper a execução de todo o script.
André Leria
1
hmmm sim, você está certo, isso não para a execução de todo o script.
themhz
throw "": ... sem causar erros ... - Não exatamente ...Uncaught ""
FZs
15

Basta ligar die()sem nunca defini-lo. Seu script irá travar. :)

Quando faço isso, geralmente ligo discombobulate(), mas o princípio é o mesmo.

(Na verdade, o que isso faz é lançar um ReferenceError, tornando-o praticamente o mesmo que a resposta do Spudly - mas é mais curto de digitar, para fins de depuração.)

Brilliand
fonte
O uso de um identificador indefinido personalizado é muito criativo! Gosto de como dieé intuitivo e conciso. Ele não tem o benefício de throwquando se trata de registrar uma mensagem de erro específica, mas às vezes apenas o número da linha é suficiente. BTW, die;sem os parênteses (des-) funciona também.
Beejor
ou simplesmente morrer; na linha onde você deseja que o seu javascript pare.
MarcoZen
Esta resposta é tão preocupada com JS ^^ Não é sujo se funcionar!
Yonn Trimoreau
7

É possível lançar sua própria versão do dado do PHP:

function die(msg)
{
    throw msg;
}

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

test();

Exemplo JSFiddle

Kelmar
fonte
Eu queria dizer que isso não funcionará em casos como var a = arguments[3] || die('message'). em vez disso, acho que o dado deveria ser: function die(msg) { return eval(`throw "${msg}"`);)mas, mesmo assim, acho que isso deveria ser colocado firmemente na linha que se quebra para que o erro mostre qual linha falhou, por exemplo this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry
Provavelmente, não tenho certeza se eval () resolve o problema se eu estou entendendo você. O ideal seria observar um rastreamento de pilha se você estivesse interessado em onde uma falha estava realmente ocorrendo. Caso contrário, acho que é seguro presumir que você simplesmente deseja relatar algum tipo de mensagem básica de falha para seu usuário.
Kelmar de
7

Se você estiver usando nodejs, você pode usar

process.exit(<code>);
Rickbsgu
fonte
4
Se fosse sobre node.js, a questão teria a tag node.js
FelixSFD
3
@FelixSFD: Mesmo assim me ajudou, já que eu estava procurando exatamente por isso, desconsiderando completamente as tags;)
DE
3

use firebug e o glorioso ...

debugger;

e nunca deixe o depurador dar qualquer passo à frente. Mais limpo do que jogar um bom Error, não é?

nourdine
fonte
2
Não é exatamente o mesmo!
Rolf
2

Não existe um equivalente exato de construção diede linguagem de PHP em Javascript . dieem PHP é quase igual a System.exit()em Java , que termina o script atual e chama ganchos de desligamento. Como alguns usuários sugeriram; throw Errorpode ser usado em alguns casos, mas nunca garante o encerramento do script atual. Sempre pode haver um bloco de tratamento de exceção em torno de sua throwinstrução - a menos que você o chame no bloco de script de nível superior, que eventualmente sai apenas do bloco de script que você está executando.

No entanto, isso não impedirá que o segundo bloco seja executado aqui (imprime olá):

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

você pode tentar com:

return 0;

que funcionam em caso de parada do processo.

Mohammed Yassine CHABLI
fonte
1

Não há saída de função equivalente a php die () em JS, se você não estiver usando nenhuma função, pode simplesmente usar return;

return;
Manu Joseph
fonte
0

Você pode usar return false; Isso encerrará seu script.

Bugfixer
fonte
3
Presumivelmente, apenas no nível superior. O die () do PHP pode ser chamado em qualquer nível e fará com que o interpretador do PHP saia imediatamente.
Rolf
0

Isso deve funcionar como die ();

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

Função die () global para fins de desenvolvimento:

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

Use o dado ():

die('Error message here');
goma
fonte
-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
arima
fonte