Чи повернення зупиняє цикл?


157

Припустимо, у мене є такий цикл:

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

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

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

Швидке запитання: чи returnзупиняє виконання циклу саме по собі?

Відповіді:


206

Так, returnзупиняє виконання та закриває функцію. returnзавжди ** припиняє свою функцію негайно, без подальшого виконання, якщо він знаходиться в циклі for.

Це легко перевірити для себе:

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

alert(returnMe());
// 1

** Примітки: Дивіться цю іншу відповідь про особливий випадок, try/catch/finally і ця відповідь про те, як для кожного циклу має власну область функцій, не вириватиметься із функції, що містить.


25
> return завжди виходить із своєї функції негайно, без подальшого виконання, якщо вона знаходиться в циклі ... якщо тільки це цикл forEach
oo

9
@oo Сорт істинного. returnяк і раніше повертається з поточної ітерації зворотного виклику функції, у власній області застосування, але, як очікується, не відірветься від всього методу виклику forEach(). Таким чином, він не повертається з самого циклу , але повертається з зворотного дзвінка, який цикл виконує. У прикладі коду із пов'язаного питання, вихід 1,2,4,5пропускається 3через повернення.
Michael Berkowski

Можливо, червона нитка така, що returnзавжди повернеться із поточного thisконтексту.
oo

Альтернативою для використання forEach () або for () в масиві для "потенційно" раннього завершення циклу є використання some ().
AnBisw

1
Я знаю, що це тривіально для деяких людей, але це так добре знайте, тому що вам більше не доведеться breakі тоді return.
NoName

60

У більшості випадків (включаючи цей) returnвийде негайно. Однак якщо повернення знаходиться в tryблоці з супровідним finallyблоком, то finallyзавжди виконується і може "перекрити" значення returnв 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

Оператор returnзупиняє цикл, лише якщо він знаходиться всередині функції. В іншому випадку ви отримаєте цю помилку:

Uncaught SyntaxError: Illegal return statement(…)

6

Цей код вийде з циклу після першої ітерації в for ofциклі:

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

наведений нижче код перейде за умовою та продовжить for ofцикл:

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

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

Дякую, це мені дуже допомагає, я використовую вузол, і повернення порушує моє, для кожного і для ... з, продовження працює так, як я очікував
veroneseComS

5

Так, раз return оператор виконується, вся функція залишається саме в цій точці.

Уявіть собі, що буде, якби це не було, і продовжуючи циклічно, і виконувати це returnтвердження кожен раз? Це визнає недійсним сенс повернення значення, коли ви думаєте про це.


1

Відповідь "так", якщо ви пишете команду return, елементи керування негайно повертаються до методу виклику. За винятком блоку нарешті, який виконується після оператора return.

і, нарешті, може також замінити значення, яке ви повернули, якщо ви повернетеся всередину, нарешті, блокуйте. ПОСИЛАННЯ: Спробуйте впіймати нарешті повернення

Визначення заяви про повернення відповідно до:

Документи Java:

оператор повернення може бути використаний для розгалуження блоку потоку управління та виходу з методу

Документація MSDN:

Оператор повернення припиняє виконання функції та повертає керування функції, що викликає. Виконання поновлюється у функції виклику в пункті, одразу після дзвінка.

Вікіпедія:

Оператор повернення змушує виконання залишити поточну підпрограму та відновитись у точці в коді одразу після виклику підпрограми, відомої як її повернення. Зворотна адреса зберігається, як правило, у стеці виклику процесу, як частина операції здійснення виклику підпрограми. Виписки повернення багатьма мовами дозволяють функції вказувати повернене значення назад до коду, який викликав функцію.


Вам потрібно правильно зв’язати використані джерела, а також в ідеалі відформатувати цитати.
Натан Туггі

це зараз добре виглядає?
користувач1179299

Я вдячний виправленням граматики, але все ще немає посилань, і ви все ще не використовуєте форматування блокчету.
Натан Туггі

0

"return" виходить із функції, але якщо ви хочете повернути великі суми даних, ви можете зберігати їх у масиві, а потім повертати замість того, щоб намагатися повертати кожен фрагмент даних 1 на 1 у циклі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.