JavaScript'te komut dosyası nasıl sonlandırılır?


158

Nasıl JavaScript komut dizisini çok PHP'nin gibi çıkabilirsiniz exitveya die? Bunun en iyi programlama uygulaması olmadığını biliyorum ama buna ihtiyacım var.


1
Bu gereksinimi genişletebileceğinizi düşünüyor musunuz, tam olarak neden bunu başarmaya çalışıyorsunuz?
andynormancx

8
@andynormancx, bu hata ayıklama için kullanışlı olabilir.
SET

5
Sadece return;yeterince gereksinimlere bağlı olabilir, hiçbir parametrelerle kalıp () gibi davranır.
Ishikawa

2
Buna "ihtiyacınız" varsa, tasarımınızı yeniden düşünmeniz daha iyi olabilir.
Frungi

24
neden her zaman ilk soru 'neden' oluyor?
john ktejik

Yanıtlar:


82

PHP'ler için JavaScript eşdeğeridie . BTW sadece ararexit() (teşekkürler splattne):

function exit( status ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null

    var i;

    if (typeof status === 'string') {
        alert(status);
    }

    window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false);

    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',
        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];

    function stopPropagation (e) {
        e.stopPropagation();
        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    }

    if (window.stop) {
        window.stop();
    }

    throw '';
}

1
İşte çıkışın kaynak kodu: kevin.vanzonneveld.net/techblog/article/…
splattne

Bu kod, öğelerdeki olayların tetiklenmesini durdurmuyor, yalnızca pencerenin olaylarını durduruyor gibi görünüyor. Bu nedenle, sayfadaki tüm öğeler arasında benzer bir şey yapmanız gerekir. Yine de hepsi çok garip bir gereklilik gibi görünüyor.
andynormancx

2
tüm kalıp kavramı biraz bozuk - akış, deneme yakalama gerektirsin ya da olmasın, her türlü olasılıkla başa çıkabilecek kapasitede olmalıdır.
annakata

"Selectstart" olayı gibi, işlenmesi gereken tüm olayları eklemediğinizi düşünüyorum.
Ono Oogami

4
XMLHttpRequest işleyicilerini durduramazsınız. Geçerli kod, aralıkların veya zaman aşımlarının yürütülmesini durdurmaz. Demo: jsfiddle.net/skibulk/wdxrtvus/1 Bunu bir düzeltme olarak düşünebilirsiniz: stackoverflow.com/a/8860203/6465140
skibulk

76

"çıkış" işlevleri genellikle programdan veya komut dizisinden parametre olarak bir hata mesajıyla birlikte çıkar. Örneğin php'de die (...)

die("sorry my fault, didn't mean to but now I am in byte nirvana")

JS'deki eşdeğeri, throw anahtar sözcüğü ile aşağıdaki gibi bir hata sinyalidir :

throw new Error();

Bunu kolayca test edebilirsiniz:

var m = 100;
throw '';
var x = 100;

x
>>>undefined
m
>>>100

48
@Sydwell: Eğer onu catch bloğu ile çevrelerseniz, yakalanır ve program burada noktaya meydan okuyarak sona ermez.
nihai

4
Hataya bir mesaj ekleyebileceğinizi unutmayın: yeni Hata at ('değişken =' + x); Üzerinde çalışırken bir komut dosyasını hızlı bir şekilde sonlandırmanın ve bir değişkenin değerini almanın güzel bir yolu.
Andrew Swift

1
@ultimate #Sydwell ment'in tüm betiği try / catch ile sarmalayacağını düşünüyorum, böylece a) temiz çıkış b) gerektiğinde olası istisna mesajı :) Yakalanmayan istisnaları atmak genellikle bir fayda sağlamaz :)
jave.web

50

Tutamaçları, olayları ve benzeri olmayan basit programlarda bile, tek prosedür olsa bile, kodu "ana" bir işleve koymak en iyisidir:

<script> 
function main()
{
//code

}
main();
</script>

Bu şekilde programı durdurmak istediğinizde "return" seçeneğini kullanabilirsiniz.


18

Bunun bir hata olmasını umursamıyorsanız, sadece şunu yazın:

fail;

Bu, ana (global) kodunuzun ilerlemesini durduracaktır. Hata ayıklamanın / testin bazı yönleri için kullanışlıdır.


1
window.failmevcut tarayıcılarda tanımlı değil.
mikemaccana

12
Önemli olan bu - siz de yapabilirsiniz mikeyMouse;- hata sona erecektir. Hızlı ve kirli.
Marc

3
Yeterince adil - belki cevabına bunu ekler misin?
mikemaccana

evet, insanların tanımsız bir değişkeni çağırarak bir ReferenceError
hatasını

13

Orada birçok yoluJS veya Node komut dosyasından . İşte en alakalı olanları:

// This will never exit!
setInterval((function() {  
    return;
}), 5000);

// This will exit after 5 seconds, with signal 1
setTimeout((function() {  
    return process.exit(1);
}), 5000);

// This will also exit after 5 seconds, and print its (killed) PID
setTimeout((function() {  
    return process.kill(process.pid);
}), 5000);

// This will also exit after 5 seconds and create a core dump.
setTimeout((function() {  
    return process.abort();
}), 5000);

Eğer iseniz repl (yani çalıştırdıktan sonra nodekomut satırında) yazabilirsiniz .exitçıkmak için.


Googling'in ilk sonucu olarak ortaya çıkan bir kısaltmayı açıklayarak okuyucuların zekasına hakaret etmek istemedim. JavaScript kodunu REPL komutlarıyla karıştırmamanızı öneririm çünkü bir kullanıcı bu kod bloğunu kopyalar / yapıştırır ve çalıştırırsa, ".exit" satırında bir Sözdizimi hatası alır.
Dan Dascalescu

6

Yerleştirin debugger;infazı durdurmak istediğiniz JavaScript kodu anahtar kelime. Ardından favori tarayıcınızın geliştirici araçlarını açın ve sayfayı yeniden yükleyin. Şimdi otomatik olarak durmalıdır. Araçlarınızın Kaynaklar bölümünü açın :debugger; anahtar sözcük vurgulanır ve komut dosyasını yürütmeye devam etme seçeneğiniz vardır.

Umut ediyorum bu yardım eder.

Daha fazla bilgi için:


6

Benim durumumda window.stop, tarayıcınızdaki X düğmesine tıklamaya benzeyen API'yi kullandım :

window.stop();

2

Sanırım bu soru cevaplandı, daha fazla bilgi için burayı tıklayın . Aşağıda gönderilmiş olan kısa cevap bulunmaktadır.

throw new Error("Stop script");

Tarayıcınızı kırılma noktaları eklemek için de kullanabilirsiniz, her tarayıcı benzerdir, tarayıcınız için aşağıdaki bilgileri kontrol edin.

Chrome kırılma noktaları bilgisi için burayı tıklayın
Firefox kırılma noktaları bilgisi için burayı tıklayın
Explorer kırılma noktaları bilgisi için tıklayın
Safari mola noktaları bilgisi için burayı tıklayın


1

Bir sayfadaki tüm Javascript uygulamalarını zorla sonlandırmanın bir yolunu arıyorsanız, bunu yapmanın resmi olarak onaylanmış bir yolu olduğundan emin değilim - bu bir güvenlik riski olabilecek türden bir şey gibi görünüyor ( Dürüst olmak gerekirse, kafamın tepesinden nasıl çıkacağını düşünemiyorum). Normalde Javascript'te kodunuzun çalışmasının durdurulmasını istediğinizde, sadece returnhangi işlevin çalışıyorsa onu kullanırsınız. (Thereturn İşlevdeki son şey ise ve işlevin bir değer döndürmemesi gerekiyorsa, ifade isteğe bağlıdır) Döndürmenin sizin için yeterli olmadığı bir neden varsa, muhtemelen neden düşündüğünüze ilişkin soruda daha fazla ayrıntı düzenlemelisiniz. buna ihtiyacınız var ve belki birisi alternatif bir çözüm sunabilir.

Pratikte, çoğu tarayıcının Javascript yorumlayıcısının bir hatayla karşılaşırlarsa geçerli komut dosyasını çalıştırmayı bırakacağını unutmayın. Böylece, bir unset değişkenin özniteliğine erişmek gibi bir şey yapabilirsiniz:

function exit() {
    p.blah();
}

ve muhtemelen senaryoyu iptal edecektir . Ancak buna güvenmemelisiniz çünkü bu hiç de standart değil ve gerçekten korkunç bir uygulama gibi görünüyor.

DÜZENLEME : Tamam, belki bu Ólafur'un ışığında o kadar da iyi bir cevap değildi. Bağlandığı die()işlev temelde benim ikinci paragrafımı gerçekleştirse de, yani sadece bir hata atıyor.


1
Tüm bunlar geçerli çalıştırılan komut dosyası bitini durduracaktır. Yeni olayların tetiklenmesini ve yeni komut dosyası bitlerini çalıştırmasını engellemez.
andynormancx

Söylemeye gerek yok, bir hata atmak için ekstra kötü bir işleve ihtiyacınız yok. Javascript yerleşik bir fırlatma bildirimine sahiptir.
Chris

Die işlevi, p.blah () işlevinizden çok daha fazlasını yapar, windows olayları boyunca çalışır ve sahip oldukları tutamaçları, olayların etkinleşmesini durduracak olan "e.preventDefault (); e.stopPropagation ();" ile değiştirir. Sonra bir istisna atar.
andynormancx

1

atmak "";

Kavramın kötüye kullanılması, ancak muhtemelen tek seçenek. Ve evet, kabul edilen cevapta belirtildiği gibi tüm olay dinleyicilerini sıfırlamanız gerekecek. Ayrıca haklıysam tek bir giriş noktasına da ihtiyacınız olacak.

Üstüne üstlük: Atar atmaz size e-posta ile rapor veren bir sayfa istiyorsunuz - bunun için örneğin Raven / Sentry kullanabilirsiniz. Ama bu, kendinize yanlış pozitifler ürettiğiniz anlamına gelir. Böyle bir durumda, bu tür olayları filtrelemek için varsayılan işleyiciyi güncellemeniz veya bu tür olayları Sentry'nin kontrol panelinde yok saymaya ayarlamanız gerekir.

window.stop ();

Bu, sayfanın yüklenmesi sırasında çalışmaz. Sayfanın kodunu çözmeyi de durdurur. Bu nedenle, kullanıcıya sayfanızın javascript içermeyen bir varyantını sunmak için gerçekten kullanamazsınız.

hata ayıklayıcı;

Yürütmeyi yalnızca hata ayıklayıcı açıkken durdurur. Harika çalışıyor, ancak bir çıktı değil.


1

JavaScript'te birden fazla yol vardır, aşağıda bunlardan bazıları

Yöntem 1:

throw new Error("Something went badly wrong!");

Yöntem 2:

return;

Yöntem 3:

return false;

Yöntem 4:

new new

Yöntem 5:

yukarıdaki yöntemi kullanarak özel işlevinizi yazın ve ihtiyacınız olan yeri arayın

Not: Kod yürütmeyi yalnızca duraklatmak istiyorsanız,

debugger; 

0

Bu küçük işlev PHP'nin çıkışını () taklit etmeye oldukça yakındır. Diğer çözümlerde olduğu gibi, başka bir şey eklemeyin.

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit

0

Komut dosyasında tanımsız herhangi bir işlev kullanırsanız, komut dosyası "Yakalanmamış Referans Hatası" nedeniyle duracaktır. Kodu takip ederek denedim ve ilk iki satırı çalıştırdım.

Bence senaryoyu durdurmanın en iyi yolu bu. Başka bir yolu varsa lütfen bana yorum yapın. Ayrıca başka bir en iyi ve basit yolu bilmek istiyorum. BTW, betiği sonlandırmak için PHP gibi Javascript'te inbuilt işlevinden çıkmadım veya ölmedim. Bilen varsa lütfen bana bildirin.

alert('Hello');

document.write('Hello User!!!');

die();  //Uncaught ReferenceError: die is not defined

alert('bye');

document.write('Bye User!!!');

0

Herhangi bir hata "atmadan" yalnızca daha fazla kodun yürütülmesini durdurmak istiyorsanız, aşağıda window.onerrorgösterildiği gibi geçici olarak geçersiz kılabilirsiniz cross-exit:

function exit(code) {
    const prevOnError = window.onerror
    window.onerror = () => {
        window.onerror = prevOnError
        return true
    }

    throw new Error(`Script termination with code ${code || 0}.`)
}

console.log("This message is logged.");
exit();
console.log("This message isn't logged.");

0

İobroker kullanıyorum ve komut dosyasını kolayca durdurmayı başardım

stopScript();

0

Çoğu durumda uygulanamaz, ancak tarayıcıda çalışan birçok eşzamansız komut dosyam vardı ve bir hack olarak yaptım

window.reload();

her şeyi durdurmak için.


0

Bunun eski olduğunu biliyorum, ancak benzer bir PHP die()işlevi istiyorsanız şunları yapabilirsiniz:

function die(reason) {
    throw new Error(reason);
}

Kullanım:

console.log("Hello");
die("Exiting script..."); // Kills script right here
console.log("World!");

Yukarıdaki örnek yalnızca "Merhaba" yazacaktır.


-1

Basitçe bir BOOL koşulu oluşturun, burada karmaşık koda gerek yok ..

Bunu bir kez doğru / veya birden çok kez çevirseniz bile, her ikisi de size bir çözüm satırı verir / çoklu değil - temelde bu kadar basit.


soru eylemdir, eylemi tetikleyen koşul değil.
ahnbizcad

-1

Yürütmeyi durdurmak için bu kod parçasını kullanıyorum:

throw new FatalError("!! Stop JS !!");

Yine de bir konsol hatası alacaksınız ama benim için iyi çalışıyor.


-2

Bu, bir koşul varsa betiği sonlandıran bir örnektir. Bunu SSE istemci tarafı javascript'imde kullanıyorum, eğer

<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>

doğrudan JSON ayrıştırmasından ayrıştırılamaz ...

if( ! SSE_HOST  ) throw new Error(['[!] SSE.js: ERR_NOHOST - finished !']);

... her neyse, genel fikir şudur:

if( error==true) throw new Error([ 'You have This error' ,  'At this file', 'At this line'  ]);

bu javasript komut dosyanızı sonlandıracak / öldürecek


1
Bu gerçekten soruya cevap vermiyor. Genel bir sorundan bahsediyorlar, özel SSE değişkenleriniz / dosyanızla hiçbir ilgisi yok.
mjk

1
mjk - şimdi daha iyi mi?
kapad

-3

throw yerine return deyimini kullanıyorum çünkü throw konsolda hata verir. bunu yapmanın en iyi yolu durumu kontrol etmektir

if(condition){
 return //whatever you want to return
}

bu, konsolda herhangi bir hata vermek yerine, programın o satırdan yürütülmesini durdurur.


1
Ancak, linterlerinizde "İşlev dışında 'dönüş' kullanılamaz" şeklinde hata veriyor
Carles Alcolea

İfade geçersiz olduğu için yürütmeyi durdurur. Ayrıca if (condition) { new new }veya kullanabilirsiniz if (condition) { purpleMonkeyDishwasher(); }.
Coderer
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.