Keluar awal dari fungsi?


402

Saya memiliki fungsi:

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

Apakah ada sesuatu seperti exit()di JavaScript?


4
Anda ingin menghentikan eksekusi atau kembali?
Ken Struys

@ Ken Struys apa bedanya? seperti yang saya mengerti, jika saya kembali, ia menghentikan eksekusi? bukan?
Simon

3
Nah ada satu hal, menggunakan pengembalian hanya akan kembali ke konteks fungsi pemanggilan. Jika Anda benar-benar ingin keluar semantik yang ingin Anda hentikan eksekusi, Anda bisa melakukan sesuatu seperti ini: vikku.info/codesnippets/javascript/…
Ken Struys

1
@ Ken - Tautan yang Anda berikan untuk menghentikan eksekusi forloop. Meski begitu, saya tidak tahu mengapa metode yang disarankan akan digunakan, ketika Anda bisa menelepon break;. Untuk menggunakan contoh dari artikel: if(i==5) break;Menggunakan returnakan menghentikan eksekusi fungsi, apakah Anda dalam satu forlingkaran atau tidak .
user113716

Syom - Ya, returnakan menghentikan eksekusi fungsi, yang tampaknya seperti yang Anda tanyakan.
user113716

Jawaban:


639

Anda bisa menggunakannya return.

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

Ini akan mengirim nilai kembali undefinedke apa pun yang disebut fungsi.

var x = myfunction();

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

Tentu saja, Anda dapat menentukan nilai pengembalian yang berbeda. Nilai apa pun yang dikembalikan akan dicatat ke konsol menggunakan contoh di atas.

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

4
Saya tahu ini adalah posting lama, dan ini adalah praktik umum TETAPI saya pikir ini adalah solusi yang buruk. Jika fungsi DITUNDA untuk mengembalikan nilai, Anda harus menggunakan kembali. Jika Anda hanya menggunakan pengembalian secara membabi buta Anda mungkin akan mengalami masalah nanti. Terutama jika Anda mulai mengikat acara yang memiliki keuntungan di dalamnya. Lihat posting ini untuk info lebih lanjut: fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme: Fungsi dalam JavaScript selalu kembali. Pernyataan pengembalian tersirat jika belum disediakan. Nilai pengembalian default adalah undefined, dan itulah yang diberikan solusi utama saya. Artikel yang Anda referensikan berbicara tentang melakukan return falsedi penangan event jQuery. Itu masalah yang sama sekali berbeda. Ini adalah cara yang tepat untuk keluar dari fungsi JavaScript. Jelas jika pemanggil bergantung pada nilai yang dikembalikan, nilai perlu didefinisikan dengan tepat.
user113716

3
... Variasi tersirat adalah if(a != 'stop') { /* run my code */ }agar kode hanya berjalan ketika atidak sama 'stop'tanpa memberikan eksplisit return. Tetapi nilai pengembaliannya identik dengan solusi saya . Dalam kedua kasus, undefinedakan dikembalikan.
user113716

3
Respons yang luar biasa. Saya tidak menyadari ada perbedaan antara mengembalikan nilai undefined vs false vs yang berbeda. Saya telah mencoba menemukan jawaban pasti mengenai perilaku ini selama satu jam terakhir. Jadi apakah aman untuk mengatakan (untuk mengulangi poin Anda) bahwa pengembalian adalah cara yang aman 100% untuk keluar dari suatu metode, bahkan jika penelepon terikat dengan peristiwa dll?

@dbme: Yah, itu semua tergantung pada apa yang diharapkan oleh metode pemanggilan fungsi. Jika beberapa pustaka kode mendefinisikan sistem acara yang akan rusak jika ia menerima undefined(atau tidak menerima nilai lain) sebagai nilai balik, maka Anda harus menyesuaikan dengan spesifikasi API itu, dan mengembalikan nilai yang benar. Umumnya untuk sistem penanganan acara, itu akan diharapkan undefinedsebagai indikasi sederhana bahwa pawang telah selesai, dan tidak ada instruksi lebih lanjut. Dengan jQuery, return false;memiliki makna khusus memberikan instruksi untuk melakukan preventDefaultdan stopPropagation.
user113716

49

Rupanya Anda bisa melakukan ini:

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

Lihat blokir lingkup melalui penggunaan label: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Saya belum melihat kelemahannya. Tapi sepertinya itu bukan penggunaan umum.

Berasal dari jawaban ini: JavaScript setara dengan dadu PHP


apakah mungkin untuk menggunakan solusi ini dengan modul ekspor nodejs? ketika saya mencobanya saya mendapatkan kesalahan "label tidak digunakan". exports.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida

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

return false; jauh lebih baik dari pada adil return;


13
Mengapa falselebih baik Saya akan mengatakan default undefinedlebih baik dalam kasus generik. Apa pun itu, Anda benar mengatakan bahwa sering kali lebih baik mengembalikan nilai yang berarti.
Brad Koch

Terserah programmer dan tergantung pada use case. Misalnya, suatu fungsi mungkin memvalidasi sesuatu, jadi jika validasi gagal, lebih masuk akal untuk mengembalikan falsedaripada undefined.
Adam McArthur

18

Ini:

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

11

Menggunakan pendekatan yang sedikit berbeda, Anda dapat menggunakan try catch, dengan pernyataan melempar.

function name() {
    try {
        ...

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

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

3

Jika Anda mencari skrip untuk menghindari mengirimkan formulir ketika beberapa kesalahan ditemukan, metode ini harus berfungsi

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

ubah jenis Tombol Kirim ke "tombol"

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

semoga ini membantu.


2

Menggunakan a returnakan menghentikan fungsi dan kembali undefined, atau nilai yang Anda tentukan dengan perintah kembali.

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

1

Saya tidak suka menjawab hal-hal yang bukan solusi nyata ...

... tetapi ketika saya mengalami masalah yang sama ini, saya membuat solusi di bawah ini:

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)
  }
}

Semoga bermanfaat bagi siapa saja.


Duh. Itu sangat sederhana sehingga saya tidak pernah memikirkannya !! Cukup berguna untuk menghindari IF bersarang besar. Terima kasih.
Debbie A

Ini akan lebih baik dengan sakelar.
bdelmas

Tergantung jika Anda ingin memiliki semua peringatan kesalahan sekaligus, hanya diberi tahu satu saja. Namun demikian, setiap kondisi perlu dijalankan.
Leo

0

Saya pikir melempar kesalahan baru adalah pendekatan yang baik untuk menghentikan eksekusi daripada hanya mengembalikan atau mengembalikan yang salah. Misalnya Saya memvalidasi sejumlah file yang hanya saya izinkan maksimum lima file untuk diunggah dalam fungsi terpisah.

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

Tapi saya memanggil fungsi ini dari fungsi aliran utama sebagai

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

Dalam contoh di atas saya tidak dapat menghentikan eksekusi kecuali jika saya melempar Error baru. Hanya mengembalikan atau mengembalikan false only berfungsi jika Anda berada dalam fungsi utama eksekusi jika tidak maka tidak akan berhasil.



-4

Jika Anda menggunakan jquery. Ini harus menghentikan fungsi dari menggelegak sehingga fungsi induk yang memanggil ini juga harus berhenti.

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

6
stopImmediatePropagation()bukan hal jQuery, dan menghentikan propagasi tidak sama dengan keluar dari suatu fungsi.
Brad Koch

-13

ketikkan sembarang perintah yang menimbulkan kesalahan, misalnya:

exit

atau

die:-)

Ini dapat menghentikan semua kode dari dieksekusi, tidak hanya seluruh fungsi. Periksa biola: jsfiddle.net/b3k0xo7n/1
treecon

1
Apa pendekatan pemrograman yang mengerikan. Bagaimana ini intuitif untuk pengembang lain yang bekerja pada basis kode yang sama?
osullic
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.