1 Востаннє редагувалося Invader (22.06.2013 14:13:36)

Тема: Не викликати інші функції, коли викликана функція вже повернула false

b('b');
a('a');

function a (val){alert(val);}
function b(val){alert(val);return false;}

Чому відбувається виклик функції a, коли попередньо викликана функція b повернула false? І як цього уникнути?

2 Востаннє редагувалося koala (22.06.2013 14:31:56)

Re: Не викликати інші функції, коли викликана функція вже повернула false

Бо це не Пролог, а JavaScript. Тут всі вирази виконуються послідовно.
А треба вам

Прихований текст
if( b( 'b' ) )
  a( 'a' );

3

Re: Не викликати інші функції, коли викликана функція вже повернула false

Якщо напролом:

if( b('b') ) a('a');

4

Re: Не викликати інші функції, коли викликана функція вже повернула false

Можлвио я не точно написав. Мене цікавить як перервати виконання програми, коли послідовно викликається декілька функцій і одна з них повертає false. Я написав отак:

if ( !b('b') ) {
    return false
}

Чому у такому випадку не відбувається подальше виконання коду? Що я такого не знаю, що я не знаю чому саме так а не інакше? І взагалі, куди повертається значення якщо return виконується в глобальній області видимості (чи де вона там викон.?). У випадку з JS всередині браузера, мабуть в браузер?

5 Востаннє редагувалося koala (22.06.2013 15:38:28)

Re: Не викликати інші функції, коли викликана функція вже повернула false

Invader написав:
if ( !b('b') ) {
    return false
}

Чому у такому випадку не відбувається подальше виконання коду? Що я такого не знаю, що я не знаю чому саме так а не інакше? І взагалі, куди повертається значення якщо return виконується в глобальній області видимості (чи де вона там викон.?). У випадку з JS всередині браузера, мабуть в браузер?

Нікуди. А куди повертається значення сінуса в виклику

sin(1);

?
Правильно - нікуди. В JavaScript нема вимоги, щоб всі повернені значення кудись потрапляли. Власне, я знаю тільки одну мову, де є така вимога - це старий стандарт Паскаля. Може, ще Фортран, але я його знаю вкрай поверхово.
А переривається виконання, бо return перериває виконання поточної функції. От і все.

P.S. Можете використовувати && - цей оператор виконує другий параметр, тільки якщо перший має значення true:

b( 'b' ) && a( 'a' );
Подякували: Invader1

6 Востаннє редагувалося koala (23.06.2013 05:51:22)

Re: Не викликати інші функції, коли викликана функція вже повернула false

Пригадав, як я на другому курсі хвилин п'ять медитував на рядок на C++

5;

Тоді на мене і зійшов цей дзен (власне, я для того цей рядок і написав, щоб зрозуміти, як воно відбувається).

7 Востаннє редагувалося Torbins (22.06.2013 23:07:27)

Re: Не викликати інші функції, коли викликана функція вже повернула false

Чому б автору замість "return false;" не кинути виняток?

8

Re: Не викликати інші функції, коли викликана функція вже повернула false

Torbins написав:

Чому б автору замість "return false;" не кинути виняток?

Бо тоді він спитає "а хто той виняток зловить"?

9

Re: Не викликати інші функції, коли викликана функція вже повернула false

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

10

Re: Не викликати інші функції, коли викликана функція вже повернула false

Кидати виняток тільки  для того щоб вийти з програми якось не гарно,  чи на те він і виняток?
Перед тим як написати на форумі шукав в Мережі інші, окрім відомого  мені з return false, способи зупинки виконання JS скрипта і знайшов цю тему http://stackoverflow.com/questions/9298 … -execution

Там  написали, що

You can call return early in a function, and at least that function will stop running. You can also just use throw '' to cause an error and stop the current process. But these won't stop everything. setTimeout and setInterval can make delayed functions and functions that run on a time interval, respectively. Those will continue to run. Javascript events will also continue to work as usual.

Ексериментально перевіряти я не став. Трішки пошукав в Інтернеті. Заглянув в "Javascript. The definitive guide. Fifth edition" і знайшов там таке:

Если исключение генерируется в функ
ции, не содержащей инструкции try/catch/finally, предназначенной для его об
работки, то исключение распространяется на код, вызвавший функцию. Так ис
ключения распространяются по лексической структуре методов JavaScript
вверх по стеку вызовов. Если обработчик исключения так и не будет найден, ис
ключение рассматривается как ошибка и о ней сообщается пользователю.