Принудительное завершение функции JavaScript — Stack Overflow на русском

Re: JavaScript, Выход из рекурсивной функции

Здравствуйте, Аноним, Вы писали:

А>Есть что то похожее на:

А>

А>Мне нужно, сейчас, на втором вызове:
А>return result;

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

Выделено выше.


dmitriid.com … GitHub … LinkedIn

JavaScript, Выход из рекурсивной функции

От: Аноним  
Дата:  25.06.10 08:08
Оценка:
Есть что то похожее на:

Мне нужно, сейчас, на втором вызове:
return result;

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

Re: JavaScript, Выход из рекурсивной функции

Здравствуйте, Аноним, Вы писали:

А>Есть что то похожее на:

Можно более реальный js. Я ничего не понимаю.

Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали

Re: JavaScript, Выход из рекурсивной функции

От: taluk  
Дата:  29.06.10 11:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть что то похожее на:

А>

А>Мне нужно, сейчас, на втором вызове:
А>return result;

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

Явно это не возможно, есть такая штука — стек вызова… Хотя есть вариант эмулировать такое поведение бросанием исключения, которое содержит результат работы функции — тогда стек рекурсивного вызова размотается до первого обработчика исключений, который будет трактовать это исключение как результат работы функции. Примерно так

Re[2]: JavaScript, Выход из рекурсивной функции

От: Аноним  
Дата:  30.06.10 04:48
Оценка:
Здравствуйте, taluk, Вы писали:

T>Здравствуйте, Аноним, Вы писали:

А>>Есть что то похожее на:

А>>

А>>Мне нужно, сейчас, на втором вызове:
А>>return result;

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

T>Явно это не возможно, есть такая штука — стек вызова… Хотя есть вариант эмулировать такое поведение бросанием исключения, которое содержит результат работы функции — тогда стек рекурсивного вызова размотается до первого обработчика исключений, который будет трактовать это исключение как результат работы функции.

Примерно так

T>

Классный солушен!! Спасибо большое!!!

Пока на собственное сообщение не было ответов, его можно удалить.

Функции в JavaScript являются объектами и могут использоваться так же, как объекты: они могут храниться в переменных, передаваться как параметры другим функциям, создаваться внутри функций и возвращаться как результат функции.

И поскольку функции — это объекты, мы можем использовать так называемые функции обратного вызова (callback-функции).

Функция обратного вызова — это техника, пришедшая из функционального программирования, активно использующаяся в JavaScript в целом, и в jQuery в частности. Функциональное программирование — это парадигма программирования, которая использует, если говорить простым языком, функции как аргументы.

Что такое функция обратного вызова?

Функция обратного вызова — это функция, которая передается другой функции в качестве параметра и та, в свою очередь, вызывает переданную функцию.

Пример использования функций обратного вызова в jQuery:

В данном примере мы передаем функцию в качестве паремтра методу click, а он, в свою очередь, вызывает переданную ему функцию. Метод коллбэков широко используется в jQuery.

Рассмотрим также пример из JavaScript:

В данном примере мы также передали анонимную функцию в качестве параметра в метод forEach.

Перед тем, как рассмотреть более сложные примеры, давайте разберемся, как работают функции обратного вызова.

Как работает функция обратного вызова?

Мы уже говорили, что все функции в JavaScript являются объектами, и именно поэтому мы можем подобно объектам создавать их, передавать в качестве параметров другим функциям, возвращать в качестве результата функции.

Когда мы передаем одну функцию другой в качестве параметра — мы фактически передаем ее определение. На этом этапе передаваемая функция не вызывается и не выполняется.

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

Важно понимать, что функция обратного вызова не выполняется немедленно. Точка внутри содержащей функции, в которой вызывается функция обратного вызова как раз и называется «обратным вызовом».

Функции обратного вызова являются замыканиями

Когда мы передаем функцию в качестве параметра другой функции, мы можем вызвать ее в любой момент внутри содержащей функции, как если бы функция обратного вызова была определена внутри содержащей функции. Это значит, что по сути функция обратного вызова является замыканием. Замыкания имеют доступ к области видимости содержащей функции, а значит могут использовать любые переменные, определенные внутри содержащей функции.

Базовые принципы реализации функций обратного вызова

Функции обратного вызова — это несложный прием, однако есть некоторые основные принципы при их реализации, с которыми мы должны познакомиться прежде, чем начать разрабатывать собственные функции обратного вызова.

Использование именованных и анонимных функций

В приведенных выше примерах мы использовали анонимные функции в качестве функций обратного вызова. Можно также определять именованные функции и передавать в качестве коллбэка имя функции.

Пример:

Передача параметров в функцию обратного вызова

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

Также можно передать функции обратного вызова любую переменную из локальной или глобальной области видимости.

Проверка коллбэк-функции перед выполнением

Перед вызовом функции обратного вызова всегда необходимо проверять, что она действительно является функцией. Также это позволяет сделать функцию обратного вызова необязательным аргументом.

Давайте добавим необходимые проверки в функцию getInput из предыдущего примера:

Использование объекта this в функциях обратного вызова

Нужно быть крайне осторожным, когда внутри коллбэк-функции используется объект this. Если эта функция передается в глобальную функцию, то объект this будет указывать на глобальные объект window, иначе на объект this содержащей функции.

Рассмотрим пример:

Вызовем функцию getUserInput, передав ей в качестве функции обратного вызова метод setUserName объекта userData:

Мы ожидаем, что значение аттрибута fullName объекта userData изменится на ‘John Snow’, но это не так:

В примере выше мы изменили глобальный объект window. Чтобы сохранить контекст функции обратного вызова, необходимо изменить способ ее вызова внутри содержащей функции, использовав функции call или apply.

Каждая функция в JavaScript имеет два метода call и apply — оба этих метода используются для изменения контекста выполнения функции и передачи ей параметров.

Метод call принимает значение, которое будет использоваться в качестве объета this внутри функции в качестве своего первого параметра, остальными параметрами должны быть параметры вызываемой функции.

Метод apply также в качестве первого параметра принимает контекст выполнения функции, а в качестве второго — массив параметров вызываемой функции.

Рассмотрим, как использование call или apply может решить проблему, описанную выше.

Заключение

Мы убедились, что коллбэк-функции — это довольно простой и, в то же время, мощный инструмент. Они широко используются в JavaScript, например, в асинхронном коде, в обработчиках событий, в методах setTimeout и setInterval.

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

JavaScript: Функции

Функция — это программный код, который определяется один раз и затем может вызываться на выполнение любое количество раз.

В JavaScript функция является значением, поэтому её можно присваивать переменным, элементам массива, свойствам объектов, передавать в качестве аргумента функциям и возвращать в качестве значения из функций.

Объявление и вызов функции

Существует три способа объявления функции: Function Declaration, Function Expression и Named Function Expression.

Function Declaration (сокращённо FD) – это «классическое» объявление функции. В JavaScript функции объявляются с помощью литерала функции. Синтаксис объявления FD:

function идентификатор (параметры) { инструкции }

Литерал функции состоит из следующих четырёх частей:

  1. Ключевое слово .
  2. Обязательный идентификатор, определяющий имя функции. В качестве имени функции обычно выбирают глагол, т. к. функция выполняет действие.
  3. Пара круглых скобок вокруг списка из нуля или более идентификаторов, разделяемых запятыми. Данные идентификаторы называются параметрами функции.
  4. Тело функции, состоящее из пары фигурных скобок, внутри которых располагаются инструкции. Тело функции может быть пустым, но фигурные скобки должны быть указаны всегда.

Простой пример:

function sayHi() { alert(«Hello»); }

Встречая ключевое слово интерпретатор создаёт функцию и затем присваивает ссылку на неё переменной с именем sayHi (переменная с данным именем создаётся интерпретатором автоматически).

Обратившись к переменной можно увидеть, что в качестве значения там находится функция (на самом деле ссылка на неё):

alert(sayHi); // function sayHi() { alert(«Hello»); }

Function Expression (сокращённо FE) – это объявление функции, которое является частью какого-либо выражения (например присваивания). Синтаксис объявления FE:

function (параметры) { инструкции }

Простой пример:

var sayHi = function () { alert(«Hello»); };

Функцию FE иначе ещё называют «анонимной функцией».

Named Function Expression (сокращённо NFE) – это объявление функции, которое является частью какого-либо выражения (например присваивания). Синтаксис объявления NFE:

function идентификатор (параметры) { инструкции }

Простой пример:

var sayHi = function foo() { alert(«Hello»); };

Объявления FE и NFE обрабатываются интерпретатором точно так же, как и объявление FD: интерпретатор создаёт функцию и сохраняет ссылку на неё в переменной sayHi.

Программный код, расположенный в теле функции, выполняется не в момент объявления функции, а в момент её вызова.

Для вызова функции используется оператор () (вызов функции):

function sayHi() { alert(«Hello»); } var sayHi2 = function () { alert(«Hello2»); }; var sayHi3 = function foo() { alert(«Hello3»); }; sayHi(); // «Hello» sayHi2(); // «Hello2» sayHi3(); // «Hello3»

Разница между представленными тремя объявлениями заключается в том, что функции, объявленные как FD, создаются интерпретатором до начала выполнения кода (на этапе анализа), поэтому их можно вызывать (в той области видимости где они объявлены) до объявления:

// Вызов функции до её объявления в коде верхнего уровня foo(); function foo() { alert(«Вызов функции foo() в глобальной области видимости.»); // Вызов функции до её объявления в области видимости функции bar(); function bar() { alert(«Вызов функции bar() в области видимости функции.»); } }

Функции, объявленные как FE или NFE, создаются в процессе выполнения кода, поэтому их можно вызывать только после того как они объявлены:

// sayHi(); // Ошибка. Функция sayHi ещё не существует var sayHi = function () { alert(«Hello!»); }; sayHi();

Функции, объявленные внутри блока, находятся в блочной области видимости:

// foo(); // Ошибка. Функция не объявлена. { foo(); // 1 function foo() { console.log(1); } } foo(); // Ошибка. Функция не объявлена.

В отличие от FE, функция, объявленная как NFE, имеет возможность обращаться к себе по имени при рекурсивном вызове. Имя функции доступно только внутри самой функции:

(function sayHi(str) { if (str) { return; } sayHi(«hi»); // Имя доступно внутри функции })(); sayHi(); // Ошибка. Функция не объявлена

Функция обратного вызова

Функция обратного вызова – это функция, которая передаётся в качестве аргумента другой функции для последующего её вызова.

Функции обратного вызова часто используются, в качестве обработчиков событий.

Ниже приведён пример функции, принимающей в качестве своего аргумента ссылку на другую функцию для её последующего вызова:

function foo(callback) { return callback(); } foo (function() { alert(«Hello!»); });

Этот пример наглядно демонстрирует принцип действия обратного вызова.

Добавить комментарий

Закрыть меню