Оператор return в JavaScript
Пример функции: нажать
Оператор return возвращает результат функции, с которым в дальнейшем можно работать: нажать
Без него возвращается » undefined «: нажать
Результат выполнения функции можно присвоить переменной: нажать
При достижении оператора return функция возвращает значение и прекращает своё выполнение, в т.ч. в начале/середине цикла: нажать
В функции может быть несколько return , но возвращается одно значение: нажать
Прервать работу скрипта или в чём разница между return; return false; return true;
Если не нужно знать достигла ли функция положительного исхода, то достаточно указать return без значения:
Если дальнейшее выполнение скрипта должно прерываться (или развиваться по другому пути) при достижении положительного исхода рассматриваемой функции, то return присваивается значение, чаще false или true :
Как остановить / завершить функцию, которая уже выполнена и выполняется? Например, у меня есть эта функция:
Теперь эта функция foo() будет работать для неограниченное время, когда происходит определенное событие, скажем, нажата кнопка остановки, тогда я хочу остановить эту функцию.
В моем случае функция не имеет функции setInterval() , И что, если функция foo() не имеет метода setInterval() , а всего лишь несколько строк кода, которые выполняются, и я хочу, чтобы он не выполнялся после определенного события.
2 ответа
Остановка работающей функции немного отличается от того, что вы фактически показываете для кода, это асинхронная операция, происходящая вне функции, которая ее инициировала.
Запуск функций может быть завершено только из функции, что можно сделать либо с помощью оператора return , либо с помощью выброса исключения.
return можно вызвать условно, чтобы функция не всегда выходила из одной и той же точки. Это часто имеет место с функциями проверки формы — если определено, что что-то недопустимо, встречается return , поэтому форма не отправляется. Если все верно, return пропускается и форма отправляется.
Вот простой пример с return :
И вот пример с выдачей ошибки (обычно это не то, что обычно делается):
Но с таймерами и интервалами вам нужно будет вызывать clearInterval() и / или clearTimeout() чтобы остановить их. Они отличаются тем, что, хотя некоторая функция может инициировать таймер или интервал, фактический таймер работает вне среды выполнения JavaScript как WebAPI. Для этого нам нужно отправить в WebAPI сообщение, чтобы таймер прекратил считать.
Теперь эта функция foo () будет запущена. в течение неограниченного времени, когда происходит конкретное событие, скажем, нажата кнопка остановки, а затем я хочу остановить эту функцию.
Но foo не работает для неограниченное время Он запускается один раз, а затем завершается. Затем, примерно через 3 секунды, таймер требует, чтобы он был запущен снова, а затем он снова завершается и так далее. Функция не работает согласованно, интервальный таймер работает.
А что если функция foo () не имеет метода setInterval (), а просто выполняет много строк кода и я хочу прекратить его выполнение после определенного события.
Похоже, ваш вопрос подразумевает, что вы хотите остановить функцию, которая выполняется в данный момент, когда происходит другое событие. В JavaScript такого не может быть, поскольку JavaScript является однопоточным окружением. Любое событие может быть вызвано и обработано только после завершения обработки всего другого кода. Таким образом, действительно не может быть сценария, подобного тому, который вы упомянули, если мы не говорим об асинхронном коде. Асинхронный код — это код, который выполняется вне среды выполнения JavaScript. С таким кодом вы можете отправить сообщение в WebAPI, который обрабатывает тот внешний код, который вы хотите отменить / прервать, и именно это мы делаем, когда мы называем clearInterval() .
Наличие объекта для хранения данных.
Акт хранения данных поступает из двух событий (двух производителей). Первый «производитель» не вызывает никакого события:
Второй вызывает события:
Вопрос в том, может ли второй продюсер нарушить выполнение первого производителя?
Я имею в виду, если производитель 1 отключает события и, прежде чем завершить выполнение (и, следовательно, до того, как события снова будут включены), продюсер 2 начнет выполнение и добавит его элемент, после чего никакие события не будут запущены. Это возможно? Может ли это случиться?
Если да, как можно преобразовать этот код в виде потокобезопасного?
javascript jquery multithreading oop thread-safety
3 ответа
3 Решение apsillers [2012-05-09 17:23:00]
JavaScript однопоточный. Функция не может быть прервана, поэтому вы можете быть уверены, что каждый функциональный блок будет завершен до начала другого.
(Однако, если функция выполняет асинхронный вызов, другие функции могут выполняться до запуска асинхронной операции. Однако этого не происходит в вашем коде, но я вижу, кроме вызовов setTimeout , и вы можете быть уверены, что они будут выполняться в правильном порядке.)
4 Jamiec [2012-05-09 17:12:00]
Не было бы более разумным передавать eventsEnabled в качестве параметра метода addElement ?
0 bPratik [2012-05-09 17:30:00]
В дополнение к предложению @Jamiec вы также можете рассмотреть возможность передачи функции события:
Используется как таковой:
Таким образом, если событие необходимо, вы можете передать его, иначе просто оставьте его.