Возврат останавливает цикл?


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 и этот ответ о том, что циклы forEach имеют свою собственную область действия функции, не выйдут из содержащей функции.


25
> return всегда завершает свою функцию немедленно, без дальнейшего выполнения, если он внутри цикла ... если только это не цикл forEach
oo

9
@ Вроде как правда. returnпо-прежнему возвращается из текущей итерации обратного вызова функции в своей области видимости, но не ожидается, что она будет прерываться из всего вызывающего метода forEach(). Таким образом, он не возвращается из самого цикла , но он возвращается из обратного вызова, который выполняет цикл. В примере кода из связанного вопроса выходные данные 1,2,4,5пропускаются 3из-за возврата.
Майкл Берковски

Возможно, красная нить returnвсегда будет возвращаться из текущего thisконтекста.
оо

Альтернативой использованию 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, элементы управления немедленно возвращаются к методу вызывающего. За исключением блока finally, который выполняется после оператора return.

И, наконец, может также переопределить возвращенное вами значение, если вы вернетесь внутрь блока finally. ССЫЛКА: Попробуй-пойми-наконец-то вернись

Вернуть определение оператора согласно:

Документы Java:

оператор return может использоваться для перехода из блока потока управления и выхода из метода

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

Оператор return завершает выполнение функции и возвращает управление вызывающей функции. Выполнение возобновляется в вызывающей функции в точке, следующей за вызовом.

Википедия:

Оператор return приводит к тому, что выполнение покидает текущую подпрограмму и возобновляет работу в той точке кода сразу после того, где была вызвана подпрограмма, известная как ее адрес возврата. Адрес возврата сохраняется, как правило, в стеке вызовов процесса, как часть операции выполнения вызова подпрограммы. Операторы возврата во многих языках позволяют функции указывать возвращаемое значение для возврата в код, вызвавший функцию.


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

это выглядит хорошо сейчас?
user1179299

Я ценю исправления грамматики, но ссылок до сих пор нет, и вы все еще не используете форматирование цитат.
Натан Тагги

0

«return» действительно завершает функцию, но если вы хотите вернуть большие суммы данных, вы можете сохранить их в массиве, а затем вернуть вместо того, чтобы пытаться вернуть каждый фрагмент данных 1 на 1 в цикле.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.