PHP'nin JavaScript eşdeğeri


102

JavaScript'te "ölmek" gibi bir şey var mı? "Ara" ile denedim ama çalışmıyor :)



"goto" gibi "ölmek", yapısal programlamaya uygun değildir. Bu tür talimatlar asla ciddi bir proje için kullanılmamalıdır. en.wikipedia.org/wiki/Structured_programming
Adrian Maire

3
function die(str) {throw new Error(str || "Script ended by death");}Veya XD bir şey Dışarıda daha iyi seçenekler var, ama bu işe yarayacak. Çalıştığından emin olmak için bir komut dosyasının yalnızca ilk bölümünü çalıştırmak istiyorsanız, hata ayıklama için iyi olabilir.
Niet the Dark Absol

@stefita Neden cevaplara yorumunuz girmiyor ?? exit () tam ihtiyacım olan şeydi. Diğer bir yol ise, bir otomatik arama döngüsü çalıştırmaktır, 1599 kez çalıştırılır ve ardından yürütme durdurulur. Teşekkürler.
m3nda

@AdrianMaire Kalbiniz doğru yerde, ancak bir sorunun "neden" sorunu söz konusu olmamalı. Kötülükleri die, goto, evalvb sonsuz özellikle düşük seviyeli hata ayıklama için, regurgitated (ve liyakat olmadan), ama hepsi kendi özel kullanımları vardır. Aksi takdirde diller onları içermez. Bu durumda, JS eşdeğerleri returnve throwyeterince zararsızdır.
Beejor

Yanıtlar:


34

Yalnızca breakbir kapsamı etiketlerseniz engelleyebilirsiniz. Örneğin:

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

Kapsamdaki bir işlevin içinden bir blok kapsamını kıramazsınız. Bu, aşağıdaki gibi şeyler yapamayacağınız anlamına gelir:

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

İşlevlerle de benzer bir şey yapabilirsiniz:

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

5
Bir blok kapsamını etiketlemeyi, bir blok kapsamı yazmayı daha az bilmiyordum. Bunun foo: {}bir nesne olduğu anlamına mı geliyor ?
ENCHANCE

3
Hayır. Bu bir blok dürbün. Aynıfoo: if(true){...}
Eli Gray

"Kapsamdaki bir işlev içinden bir blok kapsamını kıramayacağınız" için herhangi bir alternatif var mı?
haykam

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

7
bu kesinlikle cevaptır ve tıpkı die () gibi çalışır; ancak firebug'ın kırmızı "1 Hatası" na dikkat edilmemelidir!
Alexar

3
PHP'nin bir "firebug" eşdeğeri varsa, die () ;-) üzerine de "1 hata" yazması gerektiğini düşünüyorum İyi yanıt!
Adrian Maire

1
Bu, IE8'de bir uyarı iletişim kutusu oluşturmaz mı?
sbichenko

PHP de istisnaları yakaladığı için 1'e 1 eşdeğeri değildir.
Brilliand

Bu, AFAIK'in infazını tamamen durdurmayacak, ancak sadece atış çevresinde kabaca duracaktır. Özellikler çok bulanık ama betiğin başka bir yerde çalışmaya devam edebileceğinden oldukça eminim.
Rolf

22

return;Örneği kullanabilirsiniz

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

Dönüş, ana arayan işlevi test1 () 'e dönecektir; ve oradan test3 () 'e devam edin;

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

ancak sadece fırlatma eklerseniz ''; bu, herhangi bir hataya neden olmadan yürütmeyi tamamen durduracaktır.

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

Bu, firefox ve chrome ile test edilmiştir. Bunun IE veya Safari tarafından nasıl ele alındığını bilmiyorum


2
Bildiğim kadarıyla returnsadece çevreleyen fonksiyondan çıkıyor. Tüm komut dosyasını yürütmeyi durdurmak istediğinizde çalışmaz.
André Leria

1
hmmm evet haklısınız, tüm betiğin çalışmasını durdurmaz.
themhz

throw "": ... herhangi bir hataya neden olmadan ... - Pek değil ...Uncaught ""
FZs

15

die()Hiç tanımlamadan arayın . Komut dosyanız çökecek. :)

Bunu yaptığımda, genellikle discombobulate()onun yerine ararım , ancak prensip aynıdır.

(Aslında, bunun yaptığı şey ReferenceError, aşağı yukarı spudly'nin cevabı ile aynı olan a atmaktır - ancak hata ayıklama amacıyla yazmak daha kısadır.)


Özel tanımlanmamış bir tanımlayıcının kullanımı çok yaratıcıdır! dieSezgisel ve özlü olmasını seviyorum . throwBelirli bir hata mesajını kaydetmeye gelince avantajından yoksundur , ancak bazen sadece satır numarası yeterlidir. BTW, die;parantezler olmadan (un-) da çalışır.
Beejor

ya da sadece ölmek; javascript'inizin durmasını istediğiniz satırda.
MarcoZen

Bu cevap çok JS fikirlidir ^^ İşe yararsa kirli değildir!
Yonn Trimoreau

9

Nodejs kullanıyorsanız, kullanabilirsiniz

process.exit(<code>);

4
Bu node.js ile ilgili olsaydı, soru node.js
FelixSFD

3
@FelixSFD: Yine de tam olarak bunu ararken, etiketleri tamamen göz ardı ederek bana yardımcı oldu;)
DE

7

Kendi PHP kalıbınızın sürümünü almak mümkündür:

function die(msg)
{
    throw msg;
}

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

test();

JSFiddle Örneği


Bu gibi durumlarda işe yaramayacağını belirtmek istedim var a = arguments[3] || die('message'). Bunun yerine, ölmek gerektiğini düşünüyorum: function die(msg) { return eval(`throw "${msg}"`);)ama o zaman bile, bence kırılan çizgiye zor yerleştirilmelidir, böylece hata hangi satırın başarısız olduğunu gösterir, örn. this.inputFile = argv[2] || eval('throw "this program requires an input file."');
Dmitry

Muhtemelen, sizi anlıyorsam eval () 'ın sorunu çözeceğinden emin değilim. İdeal olarak, bir arızanın gerçekte nerede meydana geldiğiyle ilgileniyorsanız, yığın izlemesine bakmak gerekir. Aksi takdirde, kullanıcınıza bir tür temel hata mesajı bildirmek istediğinizi varsaymanın güvenli olduğunu düşünürdüm.
Kelmar

3

ateş böceği ve şanlıyı kullanın ...

debugger;

ve hata ayıklayıcının herhangi bir adım atmasına asla izin vermeyin. Düzgün atmaktan daha temiz Error, değil mi?


2
Tam olarak aynı değil!
Rolf

2

Javascript'tedie PHP'nin dil yapısının tam bir eşdeğeri yoktur . PHP hemen hemen eşit olduğu içinde Java akım komut sonlandırır ve kapatma kancaları çağırır. Bazı kullanıcıların önerdiği gibi; bazı durumlarda kullanılabilir, ancak hiçbir zaman mevcut betiğin sonlandırılmasını garanti etmez. İfadenizi çevreleyen bir istisna işleme bloğu her zaman olabilir - en üst düzeydeki komut dosyası bloğunda çağırmadığınız sürece, sonunda yalnızca yürütmekte olduğunuz komut dosyası bloğundan çıkar.dieSystem.exit()throw Errorthrow

Ancak ikinci bloğun burada çalıştırılmasını engellemez (merhaba yazar):

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

2

JS'de php die () işlevine eşdeğer bir işlev çıkışı yoktur, eğer herhangi bir işlev kullanmıyorsanız, o zaman sadece return kullanabilirsiniz;

return;


0

Return false kullanabilirsiniz; Bu komut dosyanızı sonlandıracak.


3
Muhtemelen sadece en üst seviyede. PHP'nin die () herhangi bir düzeyde çağrılabilir ve PHP yorumlayıcısının hemen oradan gitmesine neden olur.
Rolf

0

Bu die () gibi çalışmalıdır;

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

0

Geliştirme amaçlı global die () işlevi:

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

Die () kullanın:

die('Error message here');

-6
<script>
     alert("i am ajith fan");
     <?php die(); ?>
     alert("i love boxing");
     alert("i love MMA");
</script>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.