Fonksiyondan erken çıkış?


402

Bir fonksiyonum var:

function myfunction() {
  if (a == 'stop')  // How can I stop the function here?
}

exit()JavaScript'te böyle bir şey var mı ?


4
yürütmeyi durdurmak veya geri dönmek istiyor musunuz?
Ken Struys

@Ken Struys fark nedir? anladığım gibi, geri dönersem, yürütmeyi durdurur? değil mi?
Simon

3
İşte bir şey, bir dönüş kullanmak sadece arama işlevinin bağlamına dönecektir. Eğer yürütmeyi durdurmak istediğiniz çıkış semantikini istiyorsanız, böyle bir şey yapabilirsiniz: vikku.info/codesnippets/javascript/…
Ken Struys

1
@Ken - Sağladığınız bağlantı, bir fordöngünün yürütülmesini durdurma ile ilgilidir . O zaman bile, önerilen yöntemin neden kullanılacağını bilmiyorum break;. Makaledeki örneği kullanmak için: if(i==5) break;kullanma return, bir fordöngü içinde olsanız da olmasanız da, işlevin yürütülmesini durdurur .
user113716

Syom - Evet, returnistediğin gibi görünen fonksiyonun yürütülmesini durduracak.
user113716

Yanıtlar:


639

Sadece kullanabilirsiniz return.

function myfunction() {
     if(a == 'stop') 
         return;
}

Bu undefinedfonksiyon olarak adlandırılan şeye bir dönüş değeri gönderecektir .

var x = myfunction();

console.log( x );  // console shows undefined

Elbette, farklı bir dönüş değeri belirleyebilirsiniz. Döndürülen değer, yukarıdaki örnek kullanılarak konsola kaydedilir.

return false;
return true;
return "some string";
return 12345;

4
Bunun eski bir yazı olduğunu biliyorum, ve bu yaygın bir uygulamadır. AMA bunun kötü bir çözüm olduğunu düşünüyorum. İşlev bir değer döndürmek için SUPPOSED ise, return kullanmalısınız. Sadece körü körüne dönüş kullanırsanız, daha sonra sorun yaşayabilirsiniz. Özellikle de geri dönüşü olan olayları bağlamaya başlarsanız. Daha fazla bilgi için bu gönderiye

64
@dbme: JavaScript'teki işlevler her zaman geri döner. Return ifadesi, sağlanmamışsa örtüktür. Varsayılan dönüş değeri şudur undefinedve birincil çözümüm bunu sağlar. Başvurduğunuz makale return falsebir jQuery olay işleyicisinde yapmaktan bahsediyor . Bu tamamen farklı bir mesele. Bir JavaScript işlevinden çıkmanın uygun yolu budur. Arayanın döndürülen değere güvenmesi durumunda değerin uygun şekilde tanımlanması gerekir.
user113716

3
... Örtük bir varyasyon if(a != 'stop') { /* run my code */ }, kodun açık bir şekilde sağlamadan yalnızca aeşit 'stop'olmadığında çalışmasıdır return. Ama dönüş değeri benim çözümümle aynı . Her iki durumda undefinedda iade edilecektir.
user113716

3
Müthiş yanıt. Undefined vs false vs farklı bir değer döndürme arasında fark olduğunu fark etmedim. Son bir saattir bu davranışla ilgili kesin bir cevap bulmaya çalışıyorum. Arayanlar olaylara bağlı olsa bile, dönüşün bir yöntemden çıkmak için% 100 güvenli bir yol olduğunu söylemek güvenli midir?

@dbme: Her şey, işlevi çağıran yöntemden ne beklendiğine bağlıdır. Bazı kod kitaplığı, bir undefineddönüş değeri olarak alırsa (veya başka bir değer almazsa) kesilecek bir olay sistemini tanımlarsa , söz konusu API'nın spesifikasyonuna uymanız ve doğru değeri döndürmeniz gerekir. Genellikle bir olay işleme sistemi için, undefinedişleyicinin bittiğini gösteren basit bir gösterge olarak beklenir ve başka talimat yoktur. JQuery ile return false;bir yapılacak özel anlam veren talimatı vardır preventDefaultve stopPropagation.
user113716

49

Görünüşe göre bunu yapabilirsiniz:

function myFunction() {myFunction:{
    console.log('i get executed');
    break myFunction;
    console.log('i do not get executed');
}}

Bir etiket kullanarak blok kapsamlarına bakın: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Henüz hiçbir dezavantajı göremiyorum. Ancak ortak bir kullanım gibi görünmüyor.

Bu yanıtı türetmiştir: PHP'nin ölmesinin JavaScript eşdeğeri


bu çözümü nodejs export modülü ile kullanmak mümkün mü? denediğimde "etiket kullanılmıyor" hatası alıyorum. export.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida

20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; sadece daha iyi return;


13
Neden daha falseiyi? Varsayılan undefineddurumda daha iyi varsayılan olduğunu söyleyebilirim . Her iki durumda da, anlamlı bir değer döndürmenin genellikle daha iyi olduğunu söylemek doğrudur.
Brad Koch

Programcıya bağlıdır ve kullanım durumuna bağlıdır. Doğrulama bunun karşılığında daha mantıklı başarısız olursa Örneğin, bir fonksiyon, yani bir şeyi doğrulamak olabilir falsedaha undefined.
Adam McArthur

18

Bu:

function myfunction()
{
     if (a == 'stop')  // How can I stop working of function here?
     {
         return;
     }
}

11

Biraz farklı bir yaklaşım kullanarak try catch, throw ifadesi ile kullanabilirsiniz .

function name() {
    try {
        ...

        //get out of here
        if (a == 'stop')
            throw "exit";

        ...
    } catch (e) {
        // TODO: handle exception
    }
}

3

bazı hatalar bulunduğunda form göndermekten kaçınmak için bir komut dosyası arıyorsanız, bu yöntemin çalışması gerekir

function verifyData(){
     if (document.MyForm.FormInput.value.length == "") {
          alert("Write something!");
     }
     else {
          document.MyForm.submit();
     }
}

değişir Düğme Gönder "butonuna" türünü

<input value="Save" type="button" onClick="verifyData()">

umarım bu yardım.


2

A kullanılması returnişlevi ve dönüşü undefinedveya return komutuyla belirttiğiniz değeri durdurur .

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}

1

Gerçek bir çözüm olmayan şeylere cevap vermekten hoşlanmıyorum ...

... ama aynı sorunla karşılaştığımda, aşağıdaki geçici çözümü yaptım:

function doThis() {
  var err=0
  if (cond1) { alert('ret1'); err=1; }
  if (cond2) { alert('ret2'); err=1; }
  if (cond3) { alert('ret3'); err=1; }
  if (err < 1) {
    // do the rest (or have it skipped)
  }
}

Umarım herkes için yararlı olabilir.


Duh. Hiç düşünmemiştim o kadar basit !! Büyük iç içe IF'leri önlemek için oldukça yararlı. Teşekkürler.
Debbie A

Bu bir anahtarla daha iyi olurdu.
bdelmas

Tüm hata uyarılarının bir kerede bildirilmesini isteyip istemediğinize, yalnızca bir tanesinin size bildirilmesine bağlıdır. Ancak her koşulun yine de yürütülmesi gerekir.
Aslan

0

Bence yeni bir hata atmak sadece iade veya yanlış dönüş yerine yürütmeyi durdurmak için iyi bir yaklaşımdır. Örn. Yalnızca ayrı işlevde yüklenmek üzere en fazla beş dosyaya izin verdiğim bir dizi dosyayı doğrulıyorum.

validateMaxNumber: function(length) {
   if (5 >= length) {
        // Continue execution
   }
   // Flash error message and stop execution
   // Can't stop execution by return or return false statement; 
   let message = "No more than " + this.maxNumber + " File is allowed";
   throw new Error(message);
}

Ama bu fonksiyonu ana akış fonksiyonundan

  handleFilesUpload() {
      let files =  document.getElementById("myFile").files;
      this.validateMaxNumber(files.length);
}

Yukarıdaki örnekte, yeni Error.Just return veya return false döndürmedikçe yürütmeyi durduramıyorum, yalnızca yürütmenin ana işlevindeyseniz çalışır, aksi takdirde çalışmaz.



-4

Jquery kullanıyorsanız. Bu, işlevin köpürmesini durdurmalıdır, böylece bunu çağıran ana işlev de durmalıdır.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }

6
stopImmediatePropagation()jQuery ile ilgili bir şey değildir ve yayılmayı durdurmak bir işlevden çıkmakla aynı şey değildir.
Brad Koch

-13

hata veren herhangi bir rastgele komut yazın, örneğin:

exit

veya

die:-)

Bu, yalnızca işlevin geri kalanında değil, tüm kodların yürütülmesini durdurabilir. Kemanı
treecon

1
Ne korkunç bir programlama yaklaşımı. Bu, aynı kod tabanında çalışan başka bir geliştirici için nasıl sezgiseldir?
osullic
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.