Остановить выполнение скрипта | JavaScript
Прервать работу скрипта или в чём разница между return; return false; return true;
Если не нужно знать достигла ли функция положительного исхода, то достаточно указать return без значения:
Если дальнейшее выполнение скрипта должно прерываться (или развиваться по другому пути) при достижении положительного исхода рассматриваемой функции, то return присваивается значение, чаще false или true :
Как использовать return, когда функция вызывает саму себя (рекурсия)
Возврат массива из функции
break
Оператор break прерывает выполнение текущего цикла, оператора множественного выбора switch или блочного выражения с меткой. Выполнение кода продолжается с конструкции, следующей за прерванной.
Интерактивный пример
Синтаксис
break [label];
label Необязательный
Идентификатор связанной метки. Если прерываемое выражение не цикл или switch , указание метки обязательно.
Описание
С помощью оператора break можно прервать выполнение блочного выражения с меткой. В таком случае break должен находиться внутри блока кода с указанной меткой. Само блочное выражение может быть любым, а не только циклом.
Использование break , с меткой или без, невозможно внутри функции, которая вложена в прерываемые цикл, конструкцию switch или блочное выражение с меткой.
Примеры
break в цикле while
Следующая функция использует оператор break для выхода из цикла while , когда i станет равно 3, и возвращает значение 3 * x .
function testBreak(x) var i = 0; while (i 6) if (i == 3) break; > i += 1; > return i * x; >
break в конструкции switch
В примере оператор break прервёт выполнение switch сразу после выполнения кода в совпавшем case .
const food = "sushi"; switch (food) case "sushi": console.log("Sushi is originally from Japan."); break; case "pizza": console.log("Pizza is originally from Italy."); break; default: console.log("I have never heard of that dish."); break; >
break в блочном выражении с указанной меткой
В примере используется оператор break с меткой. В таком случае break обязательно должен быть вложен в блок кода с той же меткой. Обратите внимание, что inner_block вложен в outer_block .
outer_block: inner_block: console.log("1"); break outer_block; // break прервёт выполнение кода как в inner_block, так и в outer_block console.log(":-("); // не будет выполнено > console.log("2"); // не будет выполнено >
break вне блочного выражения с указанной меткой
В примере также используется break с меткой, но код будет выполнен с ошибкой SyntaxError , потому что break находится в блоке с меткой block_1 , а прерывается выполнение блока кода с меткой block_2 . Ещё раз, в таком случае break обязательно должен быть вложен в блок кода с меткой, выполнение которого требуется прервать.
block_1: console.log('1'); break block_2; // SyntaxError: label not found > block_2: console.log('2'); >
break внутри функций
Код в примерах также будет выполнен с ошибкой SyntaxError , потому что в обоих случаях break находится в теле функции, вложенной в прерываемый цикл или прерываемое блочное выражение с меткой.
function testBreak(x) var i = 0; while (i 6) if (i == 3) (function() break; >)(); > i += 1; > return i * x; > testBreak(1); // SyntaxError: Illegal break statement
block_1: console.log('1'); ( function() break block_1; // SyntaxError: Undefined label 'block_1' >)(); >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-break-statement |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
Завершение программы C++
Функция, объявленная exit в , завершает программу C++. Значение, предоставленное в качестве аргумента exit , возвращается операционной системе в качестве возвращаемого кода программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Константы EXIT_FAILURE можно использовать, а EXIT_SUCCESS также определенные в , чтобы указать успешность или сбой программы.
Функция abort
Функция abort , объявленная в стандартном формате, включает , завершает программу C++. Разница между exit и abort заключается в том, что exit обработка завершения среды выполнения C++ выполняется (вызывается глобальные деструкторы объектов). abort немедленно завершает программу. Функция abort проходит обычный процесс уничтожения для инициализированных глобальных статических объектов. Также осуществляется обход всей специальной обработки, которая была задана с помощью функции atexit .
Корпорация Майкрософт: по соображениям совместимости Windows реализация abort microsoft может разрешить выполнение кода завершения библиотеки DLL в определенных обстоятельствах. Дополнительные сведения см. в разделе abort .
Функция atexit
Используйте функцию atexit , чтобы указать действия, выполняемые до завершения программы. Перед выполнением функции выхода не инициализированы глобальные статические объекты, инициализированные перед вызовом atexit .
return оператор in main
Инструкция return позволяет указать возвращаемое значение из main . Оператор return в main первую очередь действует как любая другая return инструкция. Все автоматические переменные уничтожаются. main Затем вызывает возвращаемое exit значение в качестве параметра. Рассмотрим следующий пример:
// return_statement.cpp #include struct S < int value; >; int main() < S s< 3 >; exit( 3 ); // or return 3; >
return Операторы exit , описанные в предыдущем примере, имеют аналогичное поведение. Как завершить программу, так и вернуть значение 3 операционной системе. Разница заключается в том, что exit не уничтожает автоматическую переменную s , а return оператор делает.
Как правило, C++ требует, чтобы функции, имеющие возвращаемые типы, отличные от void возвращаемого значения. Функция является исключением. Она main может завершиться без инструкции return . В этом случае он возвращает значение, зависящее от реализации, в вызывающий процесс. (По умолчанию MSVC возвращает значение 0.)
Уничтожение потоков и статических объектов
При вызове exit напрямую (или при вызове после оператора из main ), объекты потоков, связанные с текущим потоком return , уничтожаются. Затем статические объекты уничтожаются в обратном порядке их инициализации (после вызовов функций, указанных в , если таковые имеются atexit ). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1 создаются и sd2 инициализированы перед записью main . После завершения работы этой программы с помощью инструкции return сначала sd2 уничтожается, а затем sd1 . Деструктор класса ShowData закрывает файлы, связанные с этими статическими объектами.
// using_exit_or_return1.cpp #include class ShowData < public: // Constructor opens a file. ShowData( const char *szDev ) < errno_t err; err = fopen_s(&OutputDev, szDev, "w" ); >// Destructor closes the file. ~ShowData() < fclose( OutputDev ); >// Disp function shows a string on the output device. void Disp( char *szData ) < fputs( szData, OutputDev ); >private: FILE *OutputDev; >; // Define a static object of type ShowData. The output device // selected is "CON" -- the standard output device. ShowData sd1 = "CON"; // Define another static object of type ShowData. The output // is directed to a file called "HELLO.DAT" ShowData sd2 = "hello.dat"; int main()
Другой способ написания этого кода заключается в объявлении ShowData объектов с блоком область, который неявно уничтожает их при выходе из область:
Arduino.ru
Все хорошо пока не выполняю функцию autol() она выполняется непрерывно.
Подскажите пожалуйста, как можно:
1. Прервать выполнение функции немедленно.
2. При возвращении в функцию начать не с того же места а с начала. То-есть заново ее запустить и забыть о прерваной итерации.
int red = 2; int yellow = 3; int green = 4; int sb = 12; int modec = 1; int reading; int lastButtonState=LOW; int buttonState=LOW; unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 0; void setup() < // put your setup code here, to run once: pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); pinMode(sb, INPUT); >void loop () < int reading = digitalRead(sb); if (reading != lastButtonState) < lastDebounceTime = millis(); >if ((millis() — lastDebounceTime) > debounceDelay) < if (reading != buttonState) < buttonState = reading; if (buttonState == HIGH) < modec++; if (modec==4) < modec=0; >> > > if (modec==0) < digitalWrite(red,LOW); digitalWrite(yellow,LOW); digitalWrite(green,LOW); autol(); >if (modec==1) < digitalWrite(red,HIGH); digitalWrite(yellow,LOW); digitalWrite(green,LOW); >if (modec==2) < digitalWrite(red,LOW); digitalWrite(yellow,HIGH); digitalWrite(green,LOW); >if (modec==3) < digitalWrite(red,LOW); digitalWrite(yellow,LOW); digitalWrite(green,HIGH); >> void autol()
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 02:18
inspiritus
Зарегистрирован: 17.12.2012
А какое событие должно вызвать это прерывание?
(мне кажется , или я ответил на его вопрос)
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 02:58
Клапауций 234
Зарегистрирован: 24.10.2016
void reset()
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 08:48
Зарегистрирован: 03.07.2016
antonzol пишет:
Все хорошо пока не выполняю функцию autol() она выполняется непрерывно.
Подскажите пожалуйста, как можно:
1. Прервать выполнение функции немедленно.
2. При возвращении в функцию начать не с того же места а с начала. То-есть заново ее запустить и забыть о прерваной итерации.
Повторяю для тах кто в ТАНКЕ, delay() прервать нельзя. Разве подождать когда она закончится. А будет это в loop(), или в функции безразлично.
Поэтой причине удобная функция delay() так НЕУДОБНА. используйте millis().
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 12:25
Зарегистрирован: 25.05.2015
Пока нет ответа на вопрос inspiritus, всё остальное — толчение воды в ступе. Ждем-с 🙂
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 12:26

Зарегистрирован: 25.05.2015
qwone пишет:
Повторяю для тах кто в ТАНКЕ, delay() прервать нельзя.
Да, ладно Вам. Любое, самое замухрыжное прерывание, прервёт delay за милую душу.
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 12:33
Зарегистрирован: 03.07.2016
ЕвгенийП пишет:
Да, ладно Вам. Любое, самое замухрыжное прерывание, прервёт delay за милую душу.
И дальше что? Передаст управление другой строке. Ну не будет же программа висеть в вечном прерывании.
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 12:34
Клапауций 234
Зарегистрирован: 24.10.2016
qwone пишет:
Повторяю для тах кто в ТАНКЕ, delay() прервать нельзя. Разве подождать когда она закончится. А будет это в loop(), или в функции безразлично.
всегда можно нажать кнопку reset и случится то, чего желает ТС
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 13:30
inspiritus
Зарегистрирован: 17.12.2012
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 13:31
Клапауций 234
Зарегистрирован: 24.10.2016
inspiritus пишет:
ага — из делея прерыванием
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 15:07

Зарегистрирован: 25.05.2015
qwone пишет:
Что нужно программисту, то и дальше.
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 16:02
Зарегистрирован: 04.05.2015
Ну так напишите свой delay() в котором будет выход по условию. Это ж программа. Не нравится стандартный delay — ни кто не запрещает написать свой, если клапауция всуе не упоминать.
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 18:03
Voodoo Doll

Зарегистрирован: 18.09.2016
#include const byte ldata[120]=; #define RED (2) #define YELLOW (3) #define GREEN (4) #define BTN (12) unsigned long last_d=millis(), // last data change last_b=millis(); // last button time byte pos=0; // cycle position bool hold=false; // stay on single color void setup() < wdt_enable(WDTO_2S); pinMode(RED, OUTPUT); pinMode(YELLOW, OUTPUT); pinMode(GREEN, OUTPUT); pinMode(BTN, INPUT); >void loop() < wdt_reset(); if(hold)< if(millis()-last_b>=500 && digitalRead(BTN)) < // button poll switch(pos)< case 0: pos=110; break; // yellow case 104: pos=0; break; // red case 109: pos=0;hold=false;last_d=millis();break; // ret to normal mode case 110: pos=109; break; // green >last_b=millis(); > >else< if(millis()-last_d>=500) < // animation cycle if(pos<119) pos+=1; else pos=0; last_d=millis(); >if(millis()-last_b>=500 && digitalRead(BTN)) < // button poll hold=true; pos=104; // no color last_b=millis(); >> digitalWrite(RED, ldata[pos]&1); //show digitalWrite(YELLOW,ldata[pos]&2); digitalWrite(GREEN, ldata[pos]&4); >
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 19:01
Зарегистрирован: 04.11.2012
Не хочу вникать в программу ТС, но если Вы хотите быстро прервать delay-длиное, то можно вместо длиного delay использовать свою функцию, которая будет тысячу раз, в цикле, использовать в тысячу раз болеее короткий delay. А между использованиями короткого delay, проверяйте нужное Вам условие для быстрого прекращения длинного delay. Если оно, условие, возникло, то прекращаете работу своей функции. Например, в операторе for ( int i=0; i переменной i по нужному Вам условию присваиваете i=1000 и цикл скоропостижно завершается.
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 19:05
Клапауций 234
Зарегистрирован: 24.10.2016
класс титановый велосипед для delay без delay().
- Войдите на сайт для отправки комментариев
Пнд, 09/01/2017 — 19:57
Зарегистрирован: 03.07.2016
Ну я конечно не решил вопрос с перыванием delay(). Я просто написал иначе программу. Я проверил собирайте и закачивайте скетч.
/*millis_antonzol.ino #1 светодиоды красный ->2 (Red_pin) 1 горит / 0 нет желтый ->3 (Yellow_pin) 1 горит / 0 нет зеленый ->4 (Green_pin) 1 горит / 0 нет #2 кнопка ->5 (Btn1_pin) 0 нажата / 0 нет */ //#1 const int Red_pin = 2; bool Red; const int Yellow_pin = 3; bool Yellow; const int Green_pin = 4; bool Green; //#2 кнопка const int Btn1_pin = 5; bool Btn1, Btn1_old; bool Bounce_Btn1 = 0; // антидребезговый флаг byte modec = 1; // режим 1 красный мигает / 2 желтый мигает /3 зеленый / переключение R -> Y -> G -> Y -> R byte step = 1; // 1 мигает красный /1 мигает желтый /1 мигает зеленый void setup() < //#1 pinMode(Red_pin, OUTPUT); digitalWrite(Red_pin, Red = 0); pinMode(Yellow_pin, OUTPUT); digitalWrite(Yellow_pin, Yellow = 0); pinMode(Green_pin, OUTPUT); digitalWrite(Green_pin, Green = 0); //#2 pinMode(Btn1_pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой Btn1 = digitalRead(Btn1_pin); >void loop () < //#1 static uint32_t past_1 = 0 ; static uint32_t past_3 = 0 ; if ((modec == 1 || modec == 4 && step == 1) && millis() - past_1 >300) < // 0,3 сек мигание красным past_1 = millis(); digitalWrite(Red_pin, Red = ! Red); if (! Red && millis()- past_3 >5000) < // если красный в режиме 4 мигает больше 5 сек past_3 = millis(); step = 2; >> if ((modec == 2 || modec == 4 && (step == 2 || step == 5)) && millis() - past_1 > 300) < // 0,3 сек мигание желтым past_1 = millis(); digitalWrite(Yellow_pin, Yellow = ! Yellow); if (! Yellow && millis()- past_3 >2000) < // если желтым в режиме 4 мигает больше 2 сек past_3 = millis(); if (step == 2)step = 3; // R->Y->G if (step == 5)step = 1;// G->Y->R > > if ((modec == 3 || modec == 4 && step == 3) && millis() - past_1 > 300) < // 0,3 сек мигание зеленым past_1 = millis(); digitalWrite(Green_pin, Green = ! Green); if (! Green && millis()- past_3 >5000) < // если желтым в режиме 4 мигает больше 5 сек past_3 = millis(); step = 5; >> //#2 static uint32_t past_2 = 0 ; if (! Bounce_Btn1 && Btn1 != digitalRead(Btn1_pin)) < // если прошел фронт изм на выводн Bounce_Btn1 = 1; // выставить флаг past_2 = millis(); // сделать временую засветку >else if ( Bounce_Btn1 && millis() - past_2 >= 5 ) < // если прошло антидребезговое время Bounce_Btn1 = 0; // то снять флаг Btn1_old = Btn1; Btn1 = digitalRead(Btn1_pin) ; // прочитать реальное значение на выводе if (Btn1_old && ! Btn1) < modec ++ ; if (modec >4) modec = 1; digitalWrite(Red_pin, Red = 0); digitalWrite(Yellow_pin, Yellow = 0); digitalWrite(Green_pin, Green = 0); > > >
- Войдите на сайт для отправки комментариев
