Thoát khỏi chức năng sớm?


402

Tôi có một chức năng:

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

Có một cái gì đó giống như exit()trong JavaScript?


4
Bạn có muốn dừng việc thực hiện hoặc quay trở lại?
Ken Struys

@Ken Struys có gì khác biệt? Theo tôi hiểu, nếu tôi quay trở lại, nó dừng thực thi? phải không
Simon

3
Vâng, đây là điều, sử dụng trả lại sẽ chỉ trở lại bối cảnh của chức năng gọi. Nếu bạn thực sự muốn thoát ngữ nghĩa mà bạn muốn dừng thực thi, bạn có thể làm một cái gì đó như thế này: vikku.info/codesnippets/javascript/ phỏng
Ken Struys

1
@Ken - Liên kết đó bạn đã cung cấp thỏa thuận với việc dừng thực thi một forvòng lặp. Thậm chí sau đó, tôi không biết tại sao phương thức được đề xuất sẽ được sử dụng, khi bạn chỉ có thể gọi break;. Để sử dụng ví dụ từ bài viết: if(i==5) break;Sử dụng returnsẽ tạm dừng việc thực hiện chức năng, cho dù bạn có ở trong một forvòng lặp hay không .
dùng113716

Syom - Có, returnsẽ dừng việc thực thi chức năng, dường như là những gì bạn yêu cầu.
dùng113716

Câu trả lời:


639

Bạn chỉ có thể sử dụng return.

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

Điều này sẽ gửi một giá trị trả về của undefinedbất cứ thứ gì được gọi là hàm.

var x = myfunction();

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

Tất nhiên, bạn có thể chỉ định một giá trị trả lại khác nhau. Bất kỳ giá trị nào được trả về sẽ được ghi vào bảng điều khiển bằng ví dụ trên.

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

4
Tôi biết đây là một bài viết cũ, và đây là cách làm phổ biến NHƯNG tôi nghĩ rằng đây là một giải pháp tồi. Nếu hàm được CUNG CẤP để trả về một giá trị, bạn nên sử dụng return. Nếu bạn chỉ mù quáng sử dụng trở lại, bạn có thể gặp vấn đề sau này. Đặc biệt là nếu bạn bắt đầu các sự kiện ràng buộc có lợi nhuận trong đó. Kiểm tra bài đăng này để biết thêm thông tin: fuelyourcoding.com/jquery-events-stop-misuses-return-false

64
@dbme: Hàm trong JavaScript luôn trả về. Tuyên bố trả lại là ẩn nếu nó không được cung cấp. Giá trị trả về mặc định là undefinedvà đó là những gì giải pháp chính của tôi cung cấp. Bài viết mà bạn tham chiếu đang nói về việc thực hiện return falsetrong trình xử lý sự kiện jQuery. Đó là một vấn đề hoàn toàn khác. Đây là cách thích hợp để thoát khỏi hàm JavaScript. Rõ ràng nếu người gọi dựa vào giá trị được trả về, giá trị cần được xác định một cách thích hợp.
dùng113716

3
... Một biến thể ngầm định sẽ là if(a != 'stop') { /* run my code */ }mã chỉ chạy khi akhông bằng 'stop'mà không cung cấp rõ ràng return. Nhưng giá trị trả lại là giống hệt với giải pháp của tôi . Trong cả hai trường hợp, undefinedsẽ được trả lại.
dùng113716

3
Phản ứng tuyệt vời. Tôi đã không nhận ra có bất kỳ sự khác biệt nào giữa việc trả lại không xác định so với sai so với giá trị khác. Tôi đã cố gắng tìm một câu trả lời dứt khoát về hành vi này trong một giờ qua. Vì vậy, có an toàn không khi nói (nhắc lại quan điểm của bạn) rằng trả về là cách an toàn 100% để thoát khỏi một phương thức, ngay cả khi người gọi bị ràng buộc với các sự kiện, v.v.?

@dbme: Vâng, tất cả phụ thuộc vào những gì được mong đợi bởi phương thức gọi hàm. Nếu một số thư viện mã xác định một hệ thống sự kiện sẽ phá vỡ nếu nó nhận được undefined(hoặc nó không nhận được một số giá trị khác) làm giá trị trả về, thì bạn sẽ cần tuân thủ đặc điểm kỹ thuật của API đó và trả về giá trị chính xác. Nói chung đối với một hệ thống xử lý sự kiện, nó sẽ undefinedlà một dấu hiệu đơn giản cho thấy trình xử lý đã kết thúc và không có hướng dẫn nào thêm. Với jQuery, return false;có ý nghĩa đặc biệt đưa ra hướng dẫn để thực hiện preventDefaultstopPropagation.
dùng113716

49

Rõ ràng bạn có thể làm điều này:

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

Xem phạm vi khối thông qua việc sử dụng nhãn: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Tôi không thể thấy bất kỳ nhược điểm nào. Nhưng nó không giống như một cách sử dụng phổ biến.

Nhận được câu trả lời này: JavaScript tương đương với chết của PHP


Có thể sử dụng giải pháp này với mô-đun xuất của nodejs? Khi tôi thử, tôi gặp lỗi "không sử dụng nhãn". export.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida

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

return false; tốt hơn nhiều so với chỉ return;


13
Tại sao falsetốt hơn? Tôi muốn nói mặc định undefinedlà tốt hơn trong trường hợp chung. Dù bằng cách nào, bạn đúng khi nói rằng thường tốt hơn là trả lại một giá trị có ý nghĩa.
Brad Koch

Tùy thuộc vào lập trình viên và phụ thuộc vào trường hợp sử dụng. Ví dụ, một hàm có thể xác nhận một cái gì đó, vì vậy nếu xác thực không thành công, nó có ý nghĩa hơn để trả về falsehơn undefined.
Adam McArthur

18

Điều này:

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

11

Sử dụng một cách tiếp cận khác nhau, bạn có thể sử dụng try catch, với tuyên bố ném.

function name() {
    try {
        ...

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

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

3

nếu bạn đang tìm kiếm một tập lệnh để tránh gửi biểu mẫu khi tìm thấy một số lỗi, phương pháp này sẽ hoạt động

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

thay đổi loại nút Gửi thành "nút"

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

hy vọng điều này giúp đỡ.


2

Sử dụng a returnsẽ dừng chức năng và trả về undefined, hoặc giá trị mà bạn chỉ định bằng lệnh return.

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

1

Tôi không thích trả lời những điều không phải là một giải pháp thực sự ...

... nhưng khi tôi gặp phải vấn đề tương tự, tôi đã giải quyết dưới đây:

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

Hy vọng nó có thể hữu ích cho bất cứ ai.


Tât nhiên. Điều đó thật đơn giản tôi không bao giờ nghĩ về nó !! Khá hữu ích để tránh IF lớn lồng nhau. Cảm ơn.
Debbie A

Điều này sẽ tốt hơn với một công tắc.
bdelmas

Phụ thuộc nếu bạn muốn có tất cả các thông báo lỗi cùng một lúc, được thông báo chỉ một. Tuy nhiên, mỗi điều kiện cần phải được thực hiện.
Leo

0

Tôi nghĩ rằng ném một lỗi mới là cách tiếp cận tốt để dừng thực thi thay vì chỉ trả về hoặc trả về sai. Dành cho người cũ Tôi đang xác thực một số tệp mà tôi chỉ cho phép tối đa năm tệp để tải lên trong chức năng riêng biệt.

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

Nhưng tôi gọi hàm này từ hàm luồng chính là

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

Trong ví dụ trên, tôi không thể dừng thực thi trừ khi tôi ném Error mới. Trả về hoặc trả về false chỉ hoạt động nếu bạn đang ở trong chức năng chính của thực thi nếu không nó không hoạt động.



-4

Nếu bạn đang sử dụng jquery. Điều này sẽ ngăn chức năng sủi bọt lên để hàm cha gọi nó cũng dừng lại.

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

6
stopImmediatePropagation()không phải là một điều jQuery và dừng truyền bá không giống như thoát khỏi một chức năng.
Brad Koch

-13

gõ bất kỳ lệnh ngẫu nhiên nào gây ra lỗi, ví dụ:

exit

hoặc là

die:-)

Điều này có thể ngăn tất cả mã được thực thi, không chỉ phần còn lại của hàm. Kiểm tra fiddle: jsfiddle.net/b3k0xo7n/1
treecon

1
Thật là một cách tiếp cận lập trình khủng khiếp. Làm thế nào là trực quan cho một nhà phát triển khác làm việc trên cùng một cơ sở mã?
osullic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.