Có trở lại dừng một vòng lặp?


156

Giả sử tôi có một vòng lặp như thế này:

for (var i = 0; i < SomeArrayOfObject.length; i++) {

  if (SomeArray[i].SomeValue === SomeCondition) {

     var SomeVar = SomeArray[i].SomeProperty;
     return SomeVar;
  }
}

Câu hỏi nhanh: việc returndừng thực thi vòng lặp trong chính nó?

Câu trả lời:


205

Có, returndừng thực thi và thoát khỏi chức năng.returnluôn luôn ** thoát khỏi chức năng của nó ngay lập tức, không thực hiện thêm nếu nó nằm trong vòng lặp for.

Nó dễ dàng được xác minh cho chính bạn:

function returnMe() {
  for (var i=0; i<2; i++) {
    if (i === 1) return i;
  }
}

alert(returnMe());
// 1

** Lưu ý: Xem câu trả lời khác này về trường hợp đặc biệt try/catch/finallycâu trả lời này về cách các vòng lặp forEach có phạm vi chức năng riêng của nó sẽ không thoát ra khỏi hàm chứa.


25
> return luôn thoát khỏi chức năng của nó ngay lập tức, không thực hiện thêm nếu nó nằm trong vòng lặp ... trừ khi đó là vòng lặp forEach
oo

9
@oo Sắp xếp đúng sự thật. returnvẫn trả về từ lần lặp hiện tại của hàm gọi lại, trong phạm vi riêng của nó, nhưng sẽ không bị phá vỡ khỏi toàn bộ phương thức gọi forEach(). Vì vậy, nó không trở về từ chính vòng lặp , nhưng nó đang quay trở lại từ cuộc gọi lại mà vòng lặp thực thi. Trong ví dụ mã từ câu hỏi được liên kết, đầu ra bị 1,2,4,5bỏ qua 3vì trả về.
Michael Berkowski

Có lẽ chủ đề màu đỏ là returnsẽ luôn luôn trở lại từ thisbối cảnh hiện tại .
oo

Cách thay thế cho việc sử dụng forEach () hoặc for () trên một mảng để chấm dứt vòng lặp sớm có khả năng là sử dụng một số ().
AnBisw

1
Tôi biết điều này là không đáng kể đối với một số người, nhưng đây là bí quyết rất tốt bởi vì bạn không còn phải breakvà sau đó return.
NoName

60

Trong hầu hết các trường hợp (bao gồm cả trường hợp này), returnsẽ thoát ngay lập tức. Tuy nhiên, nếu trả về nằm trong một trykhối có một finallykhối đi kèm , thì finallyluôn luôn thực thi và có thể "ghi đè" returntrong try.

function foo() {
    try {
        for (var i = 0; i < 10; i++) {
            if (i % 3 == 0) {
                return i; // This executes once
            }
        }
    } finally {
        return 42; // But this still executes
    }
}

console.log(foo()); // Prints 42

8

Câu returnlệnh chỉ dừng một vòng lặp nếu nó nằm trong hàm. Nếu không, bạn sẽ gặp lỗi này:

Uncaught SyntaxError: Illegal return statement(…)

6

Mã này sẽ thoát khỏi vòng lặp sau lần lặp đầu tiên trong một for ofvòng lặp:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];
for (const iterator of objc) {
  if (iterator.name == 2) {
    return;
  }
  console.log(iterator.name);// 1
}

đoạn mã dưới đây sẽ nhảy vào điều kiện và tiếp tục một for ofvòng lặp:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];

for (const iterator of objc) {
  if (iterator.name == 2) {
    continue;
  }
  console.log(iterator.name); // 1  , 3
}

Cảm ơn, điều này giúp tôi rất nhiều, tôi đang sử dụng nút và lợi nhuận đang phá vỡ, vì mỗi và cho ... của, tiếp tục hoạt động như tôi mong đợi
veroneseComS

5

Vâng, một khi return câu lệnh được thực thi, toàn bộ hàm được thoát tại chính điểm đó.

Chỉ cần tưởng tượng điều gì sẽ xảy ra nếu nó không và tiếp tục lặp lại, và thực hiện returncâu lệnh đó mỗi lần? Nó sẽ làm mất hiệu lực ý nghĩa của việc trả lại một giá trị khi bạn nghĩ về nó.


1

Câu trả lời là có, nếu bạn viết câu lệnh return, các điều khiển sẽ quay trở lại phương thức người gọi ngay lập tức. Ngoại trừ khối cuối cùng, được thực thi sau câu lệnh return.

và cuối cùng cũng có thể ghi đè giá trị bạn đã trả về, nếu bạn quay lại bên trong khối cuối cùng. LIÊN KẾT: thử-bắt-cuối-trở lại

Định nghĩa tuyên bố trả về theo:

Tài liệu Java:

một câu lệnh return có thể được sử dụng để phân nhánh ra khỏi khối luồng điều khiển và thoát khỏi phương thức

Tài liệu MSDN:

Câu lệnh return kết thúc việc thực thi một chức năng và trả lại quyền điều khiển cho chức năng gọi. Thực thi lại trong chức năng gọi tại điểm ngay sau cuộc gọi.

Wikipedia:

Một câu lệnh return khiến cho việc thực thi rời khỏi chương trình con hiện tại và tiếp tục tại điểm trong mã ngay sau khi chương trình con được gọi, được gọi là địa chỉ trả về của nó. Địa chỉ trả lại được lưu, thường là trên ngăn xếp cuộc gọi của quy trình, như là một phần của hoạt động thực hiện cuộc gọi chương trình con. Các câu lệnh trả về trong nhiều ngôn ngữ cho phép một hàm chỉ định giá trị trả về được chuyển trở lại mã được gọi là hàm.


Bạn cần liên kết chính xác các nguồn bạn đã sử dụng và định dạng lý tưởng cho các trích dẫn là tốt.
Nathan Tuggy

điều đó có ổn không
dùng1179299

Tôi đánh giá cao các bản sửa lỗi ngữ pháp, nhưng vẫn không có bất kỳ liên kết nào và bạn vẫn không sử dụng định dạng blockquote.
Nathan Tuggy

0

"return" không thoát khỏi hàm nhưng nếu bạn muốn trả về một lượng lớn dữ liệu, bạn có thể lưu trữ nó trong một mảng và sau đó trả về nó thay vì cố gắng trả lại từng phần dữ liệu 1 trong vòng lặp.

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.