Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Альтернатива return с меткой (https://javascript.ru/forum/misc/7319-alternativa-return-s-metkojj.html)

Niar 26.01.2010 16:08

Альтернатива return с меткой
 
Чтобы выйти из цикла можно использовать break
for(){
break;
}

В функции можно использовать return без выражения справа.
function func(){
return;
}

Чтобы во вложенном цикле выйти из внешнего можно использовать break с меткой
firstfor:
for(){
for(){
break firstfor;
}
}

Вопрос как из вложенной функции завершить внешнюю
function func1(){
functiob func2(){
//Что-то завершающие func1
}
}

PeaceCoder 26.01.2010 16:38

function func1(){
  try{
    function func2(){
      //Что-то завершающие
      throw 'exit';
      }
    продолжение func1;
    }catch(e){if e!=='exit' throw e}
  }


Но оно гораздо медленее ретурнов. Легче сделать ретурн с опред значением и его на выходе проверять.
try catch vs. returns кто быстрее ?

Niar 26.01.2010 16:40

Спасибо
Поставил +

x-yuri 28.01.2010 09:58

Цитата:

Сообщение от Niar
Вопрос как из вложенной функции завершить внешнюю

не надо этого хотеть (c)

Dmitry A. Soshnikov 28.01.2010 12:40

Цитата:

Сообщение от x-yuri
не надо этого хотеть (c)

Ну, почему? Возможны варианты, когда из фунарга удобно завершить и саму функцию (например, в Ruby для таких случаев предусмотрены две конструкции): http://javascript.ru/blog/Dmitry-A.-...unarg-i-return

x-yuri 28.01.2010 13:17

хорошо, а можно практический пример?

Dmitry A. Soshnikov 28.01.2010 13:50

Цитата:

Сообщение от x-yuri
хорошо, а можно практический пример?

Там же в статье был:


function getElement() {
  [1, 2, 3].forEach(function (element) {
    if (element % 2 == 0) {
      // возврат в функционал - .forEach,
      // но не выход из getElement
      alert('found: ' + element); // found: 2
      return element;
    }
  });
  return null;
}
alert(getElement()); // null, а не 2

x-yuri 29.01.2010 09:58

ну так здесь нету никакого завершения внешней функции из вложенной.

Kolyaj 29.01.2010 10:21

Dmitry A. Soshnikov,
че-та я тоже пример не понял.

Цитата:

Сообщение от Dmitry A. Soshnikov
null, а не 2

А почему должен быть 2?

Dmitry A. Soshnikov 29.01.2010 13:03

Цитата:

Сообщение от x-yuri
ну так здесь нету никакого завершения внешней функции из вложенной.

Зависит от реализаций, в данном случае читай - завершение функции getElement из двойного вложения: метода .forEach и функции-аргумента. В ES такое невозможно. В других языка (например, Smalltak) - возможно.

Цитата:

Сообщение от Kolyaj
Dmitry A. Soshnikov,
че-та я тоже пример не понял.
А почему должен быть 2?

Нет, не должен, конечно. Для ES должен быть, правильно, null. Но вопрос в том, что иногда это может быть удобно, и, что в других языках предусмотрены для этого конструкции.

Вот этот раздел: http://en.wikipedia.org/wiki/Closure...in_sema ntics (там пониже как раз примеры на Ruby с разными вариациями return-a приводится)

Но речь идёт только о возможном завершении стека вызова (когда контексты существуют); и в Ruby можно сделать ошибку return-a, когда он не сможет определить, в какой контекст возвращать.


Часовой пояс GMT +3, время: 20:34.