Возврат значения функции javascript

Зачастую нам надо повторять одно и то же действие во многих частях программы.

Например, красиво вывести сообщение необходимо при приветствии посетителя, при выходе посетителя с сайта, ещё где-нибудь.

Чтобы не повторять один и тот же код во многих местах, придуманы функции. Функции являются основными «строительными блоками» программы.

Примеры встроенных функций вы уже видели – это alert(message) , prompt(message, default) и confirm(question) . Но можно создавать и свои.

Пример объявления функции:

Вначале идет ключевое слово function , после него имя функции, затем список параметров в скобках (в примере выше он пустой) и тело функции – код, который выполняется при её вызове.

Объявленная функция доступна по имени, например:

Этот код выведет сообщение два раза. Уже здесь видна главная цель создания функций: избавление от дублирования кода.

Если понадобится поменять сообщение или способ его вывода – достаточно изменить его в одном месте: в функции, которая его выводит.

Локальные переменные

Функция может содержать локальные переменные, объявленные через var . Такие переменные видны только внутри функции:

Блоки if/else , switch , for , while , do..while не влияют на область видимости переменных.

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

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

Объявления переменных в примере выше можно передвинуть вверх, это ни на что не повлияет:

Внешние переменные

Функция может обратиться ко внешней переменной, например:

Доступ возможен не только на чтение, но и на запись. При этом, так как переменная внешняя, то изменения будут видны и снаружи функции:

Конечно, если бы внутри функции, в строке (1) , была бы объявлена своя локальная переменная var userName , то все обращения использовали бы её, и внешняя переменная осталась бы неизменной.

Переменные, объявленные на уровне всего скрипта, называют «глобальными переменными».

В примере выше переменная userName – глобальная.

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

В старом стандарте JavaScript существовала возможность неявного объявления переменных присвоением значения.

В коде выше переменная message нигде не объявлена, а сразу присваивается. Скорее всего, программист просто забыл поставить var .

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

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

Забыли var в одном месте, потом в другом – в результате одна функция неожиданно поменяла глобальную переменную, которую использует другая. И поди разберись, кто и когда её поменял, не самая приятная ошибка для отладки.

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

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

Например, этот код выводит два сообщения:

Параметры копируются в локальные переменные функции.

Например, в коде ниже есть внешняя переменная from , значение которой при запуске функции копируется в параметр функции с тем же именем. Далее функция работает уже с параметром:

Аргументы по умолчанию

Функцию можно вызвать с любым количеством аргументов.

Если параметр не передан при вызове – он считается равным undefined .

Например, функцию показа сообщения showMessage(from, text) можно вызвать с одним аргументом:

При этом можно проверить, и если параметр не передан – присвоить ему значение «по умолчанию»:

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

Для указания значения «по умолчанию», то есть, такого, которое используется, если аргумент не указан, используется два способа:

Можно проверить, равен ли аргумент undefined , и если да – то записать в него значение по умолчанию. Этот способ продемонстрирован в примере выше.

Второй способ считает, что аргумент отсутствует, если передана пустая строка, 0 , или вообще любое значение, которое в логическом контексте является false .

Если аргументов передано больше, чем надо, например showMessage(«Маша», «привет», 1, 2, 3) , то ошибки не будет. Но, чтобы получить такие «лишние» аргументы, нужно будет прочитать их из специального объекта arguments , который мы рассмотрим в главе Псевдомассив аргументов «arguments».

Возврат значения

Функция может возвратить результат, который будет передан в вызвавший её код.

Например, создадим функцию calcD , которая будет возвращать дискриминант квадратного уравнения по формуле b 2 – 4ac :

Для возврата значения используется директива return .

Она может находиться в любом месте функции. Как только до неё доходит управление – функция завершается и значение передается обратно.

Вызовов return может быть и несколько, например:

Директива return может также использоваться без значения, чтобы прекратить выполнение и выйти из функции.

В коде выше, если сработал if , то строка (*) и весь код под ней никогда не выполнится, так как return завершает выполнение функции.

В случае, когда функция не вернула значение или return был без аргументов, считается что она вернула undefined :

Обратите внимание, никакой ошибки нет. Просто возвращается undefined .

Ещё пример, на этот раз с return без аргумента:

Выбор имени функции

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

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

Функции, которые начинаются с «show» – что-то показывают:

Функции, начинающиеся с «get» – получают, и т.п.:

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

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

Если оно сложное и подразумевает поддействия – может быть имеет смысл выделить их в отдельные функции? Зачастую это имеет смысл, чтобы лучше структурировать код.

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

Например, функция проверки данных (скажем, «validate» ) не должна показывать сообщение об ошибке. Её действие – проверить.

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

Например, во фреймворке jQuery есть функция $ , во фреймворке Prototype – функция $$ , а в библиотеке LoDash очень активно используется функция с названием из одного символа подчеркивания _ .

Объявление функции имеет вид:

  • Передаваемые значения копируются в параметры функции и становятся локальными переменными.
  • Параметры функции копируются в её локальные переменные.
  • Можно объявить новые локальные переменные при помощи var .
  • Значение возвращается оператором return . .
  • Вызов return тут же прекращает функцию.
  • Если return; вызван без значения, или функция завершилась без return , то её результат равен undefined .

При обращении к необъявленной переменной функция будет искать внешнюю переменную с таким именем, но лучше, если функция использует только локальные переменные:

  • Это делает очевидным общий поток выполнения – что передаётся в функцию и какой получаем результат.
  • Это предотвращает возможные конфликты доступа, когда две функции, возможно написанные в разное время или разными людьми, неожиданно друг для друга меняют одну и ту же внешнюю переменную.
  • Имя функции должно понятно и чётко отражать, что она делает. Увидев её вызов в коде, вы должны тут же понимать, что она делает.
  • Функция – это действие, поэтому для имён функций, как правило, используются глаголы.
Читайте так же:  Доверенность на право управления автомобилем от юридического лица образец

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

Обязателен ли «else»?

Следующая функция возвращает true , если параметр age больше 18 . В ином случае она задаёт вопрос посредством вызова confirm и возвращает его результат.

Будет ли эта функция работать как-то иначе, если убрать else ?

Есть ли хоть одно отличие в поведении этого варианта?

Оба варианта функции работают одинаково, отличий нет.

Перепишите функцию, используя оператор ‘?’ или ‘||’

Следующая функция возвращает true , если параметр age больше 18 . В ином случае она задаёт вопрос confirm и возвращает его результат.

Перепишите функцию, чтобы она делала то же самое, но без if , в одну строку. Сделайте два варианта функции checkAge :

  1. Используя оператор ‘?’
  2. Используя оператор ||

решение

Используя оператор || (самый короткий вариант):

Зачастую нам надо повторять одно и то же действие во многих частях программы.

Например, красиво вывести сообщение необходимо при приветствии посетителя, при выходе посетителя с сайта, ещё где-нибудь.

Чтобы не повторять один и тот же код во многих местах, придуманы функции. Функции являются основными «строительными блоками» программы.

Примеры встроенных функций вы уже видели – это alert(message) , prompt(message, default) и confirm(question) . Но можно создавать и свои.

Пример объявления функции:

Вначале идет ключевое слово function , после него имя функции, затем список параметров в скобках (в примере выше он пустой) и тело функции – код, который выполняется при её вызове.

Объявленная функция доступна по имени, например:

Этот код выведет сообщение два раза. Уже здесь видна главная цель создания функций: избавление от дублирования кода.

Если понадобится поменять сообщение или способ его вывода – достаточно изменить его в одном месте: в функции, которая его выводит.

Локальные переменные

Функция может содержать локальные переменные, объявленные через var . Такие переменные видны только внутри функции:

Блоки if/else , switch , for , while , do..while не влияют на область видимости переменных.

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

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

Объявления переменных в примере выше можно передвинуть вверх, это ни на что не повлияет:

Внешние переменные

Функция может обратиться ко внешней переменной, например:

Доступ возможен не только на чтение, но и на запись. При этом, так как переменная внешняя, то изменения будут видны и снаружи функции:

Конечно, если бы внутри функции, в строке (1) , была бы объявлена своя локальная переменная var userName , то все обращения использовали бы её, и внешняя переменная осталась бы неизменной.

Переменные, объявленные на уровне всего скрипта, называют «глобальными переменными».

В примере выше переменная userName – глобальная.

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

В старом стандарте JavaScript существовала возможность неявного объявления переменных присвоением значения.

В коде выше переменная message нигде не объявлена, а сразу присваивается. Скорее всего, программист просто забыл поставить var .

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

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

Забыли var в одном месте, потом в другом – в результате одна функция неожиданно поменяла глобальную переменную, которую использует другая. И поди разберись, кто и когда её поменял, не самая приятная ошибка для отладки.

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

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

Например, этот код выводит два сообщения:

Параметры копируются в локальные переменные функции.

Например, в коде ниже есть внешняя переменная from , значение которой при запуске функции копируется в параметр функции с тем же именем. Далее функция работает уже с параметром:

Аргументы по умолчанию

Функцию можно вызвать с любым количеством аргументов.

Если параметр не передан при вызове – он считается равным undefined .

Например, функцию показа сообщения showMessage(from, text) можно вызвать с одним аргументом:

При этом можно проверить, и если параметр не передан – присвоить ему значение «по умолчанию»:

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

Для указания значения «по умолчанию», то есть, такого, которое используется, если аргумент не указан, используется два способа:

Можно проверить, равен ли аргумент undefined , и если да – то записать в него значение по умолчанию. Этот способ продемонстрирован в примере выше.

Второй способ считает, что аргумент отсутствует, если передана пустая строка, 0 , или вообще любое значение, которое в логическом контексте является false .

Если аргументов передано больше, чем надо, например showMessage(«Маша», «привет», 1, 2, 3) , то ошибки не будет. Но, чтобы получить такие «лишние» аргументы, нужно будет прочитать их из специального объекта arguments , который мы рассмотрим в главе Псевдомассив аргументов «arguments».

Возврат значения

Функция может возвратить результат, который будет передан в вызвавший её код.

Например, создадим функцию calcD , которая будет возвращать дискриминант квадратного уравнения по формуле b 2 – 4ac :

Для возврата значения используется директива return .

Она может находиться в любом месте функции. Как только до неё доходит управление – функция завершается и значение передается обратно.

Вызовов return может быть и несколько, например:

Директива return может также использоваться без значения, чтобы прекратить выполнение и выйти из функции.

В коде выше, если сработал if , то строка (*) и весь код под ней никогда не выполнится, так как return завершает выполнение функции.

В случае, когда функция не вернула значение или return был без аргументов, считается что она вернула undefined :

Обратите внимание, никакой ошибки нет. Просто возвращается undefined .

Ещё пример, на этот раз с return без аргумента:

Выбор имени функции

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

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

Функции, которые начинаются с «show» – что-то показывают:

Функции, начинающиеся с «get» – получают, и т.п.:

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

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

Если оно сложное и подразумевает поддействия – может быть имеет смысл выделить их в отдельные функции? Зачастую это имеет смысл, чтобы лучше структурировать код.

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

Например, функция проверки данных (скажем, «validate» ) не должна показывать сообщение об ошибке. Её действие – проверить.

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

Например, во фреймворке jQuery есть функция $ , во фреймворке Prototype – функция $$ , а в библиотеке LoDash очень активно используется функция с названием из одного символа подчеркивания _ .

Объявление функции имеет вид:

  • Передаваемые значения копируются в параметры функции и становятся локальными переменными.
  • Параметры функции копируются в её локальные переменные.
  • Можно объявить новые локальные переменные при помощи var .
  • Значение возвращается оператором return . .
  • Вызов return тут же прекращает функцию.
  • Если return; вызван без значения, или функция завершилась без return , то её результат равен undefined .
Читайте так же:  Закон челябинска о тишине

При обращении к необъявленной переменной функция будет искать внешнюю переменную с таким именем, но лучше, если функция использует только локальные переменные:

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

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

Обязателен ли «else»?

Следующая функция возвращает true , если параметр age больше 18 . В ином случае она задаёт вопрос посредством вызова confirm и возвращает его результат.

Будет ли эта функция работать как-то иначе, если убрать else ?

Есть ли хоть одно отличие в поведении этого варианта?

Оба варианта функции работают одинаково, отличий нет.

Перепишите функцию, используя оператор ‘?’ или ‘||’

Следующая функция возвращает true , если параметр age больше 18 . В ином случае она задаёт вопрос confirm и возвращает его результат.

Перепишите функцию, чтобы она делала то же самое, но без if , в одну строку. Сделайте два варианта функции checkAge :

  1. Используя оператор ‘?’
  2. Используя оператор ||

решение

Используя оператор || (самый короткий вариант):

Зачастую нам надо повторять одно и то же действие во многих частях программы.

Например, красиво вывести сообщение необходимо при приветствии посетителя, при выходе посетителя с сайта, ещё где-нибудь.

Чтобы не повторять один и тот же код во многих местах, придуманы функции. Функции являются основными «строительными блоками» программы.

Примеры встроенных функций вы уже видели – это alert(message) , prompt(message, default) и confirm(question) . Но можно создавать и свои.

Пример объявления функции:

Вначале идет ключевое слово function , после него имя функции, затем список параметров в скобках (в примере выше он пустой) и тело функции – код, который выполняется при её вызове.

Объявленная функция доступна по имени, например:

Этот код выведет сообщение два раза. Уже здесь видна главная цель создания функций: избавление от дублирования кода.

Если понадобится поменять сообщение или способ его вывода – достаточно изменить его в одном месте: в функции, которая его выводит.

Локальные переменные

Функция может содержать локальные переменные, объявленные через var . Такие переменные видны только внутри функции:

Блоки if/else , switch , for , while , do..while не влияют на область видимости переменных.

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

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

Объявления переменных в примере выше можно передвинуть вверх, это ни на что не повлияет:

Внешние переменные

Функция может обратиться ко внешней переменной, например:

Доступ возможен не только на чтение, но и на запись. При этом, так как переменная внешняя, то изменения будут видны и снаружи функции:

Конечно, если бы внутри функции, в строке (1) , была бы объявлена своя локальная переменная var userName , то все обращения использовали бы её, и внешняя переменная осталась бы неизменной.

Переменные, объявленные на уровне всего скрипта, называют «глобальными переменными».

В примере выше переменная userName – глобальная.

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

В старом стандарте JavaScript существовала возможность неявного объявления переменных присвоением значения.

В коде выше переменная message нигде не объявлена, а сразу присваивается. Скорее всего, программист просто забыл поставить var .

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

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

Забыли var в одном месте, потом в другом – в результате одна функция неожиданно поменяла глобальную переменную, которую использует другая. И поди разберись, кто и когда её поменял, не самая приятная ошибка для отладки.

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

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

Например, этот код выводит два сообщения:

Параметры копируются в локальные переменные функции.

Например, в коде ниже есть внешняя переменная from , значение которой при запуске функции копируется в параметр функции с тем же именем. Далее функция работает уже с параметром:

Аргументы по умолчанию

Функцию можно вызвать с любым количеством аргументов.

Если параметр не передан при вызове – он считается равным undefined .

Например, функцию показа сообщения showMessage(from, text) можно вызвать с одним аргументом:

При этом можно проверить, и если параметр не передан – присвоить ему значение «по умолчанию»:

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

Для указания значения «по умолчанию», то есть, такого, которое используется, если аргумент не указан, используется два способа:

Можно проверить, равен ли аргумент undefined , и если да – то записать в него значение по умолчанию. Этот способ продемонстрирован в примере выше.

Второй способ считает, что аргумент отсутствует, если передана пустая строка, 0 , или вообще любое значение, которое в логическом контексте является false .

Если аргументов передано больше, чем надо, например showMessage(«Маша», «привет», 1, 2, 3) , то ошибки не будет. Но, чтобы получить такие «лишние» аргументы, нужно будет прочитать их из специального объекта arguments , который мы рассмотрим в главе Псевдомассив аргументов «arguments».

Возврат значения

Функция может возвратить результат, который будет передан в вызвавший её код.

Например, создадим функцию calcD , которая будет возвращать дискриминант квадратного уравнения по формуле b 2 – 4ac :

Для возврата значения используется директива return .

Она может находиться в любом месте функции. Как только до неё доходит управление – функция завершается и значение передается обратно.

Вызовов return может быть и несколько, например:

Директива return может также использоваться без значения, чтобы прекратить выполнение и выйти из функции.

В коде выше, если сработал if , то строка (*) и весь код под ней никогда не выполнится, так как return завершает выполнение функции.

В случае, когда функция не вернула значение или return был без аргументов, считается что она вернула undefined :

Обратите внимание, никакой ошибки нет. Просто возвращается undefined .

Ещё пример, на этот раз с return без аргумента:

Выбор имени функции

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

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

Функции, которые начинаются с «show» – что-то показывают:

Функции, начинающиеся с «get» – получают, и т.п.:

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

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

Если оно сложное и подразумевает поддействия – может быть имеет смысл выделить их в отдельные функции? Зачастую это имеет смысл, чтобы лучше структурировать код.

Читайте так же:  Интеллектуальная собственность инвестиции

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

Например, функция проверки данных (скажем, «validate» ) не должна показывать сообщение об ошибке. Её действие – проверить.

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

Например, во фреймворке jQuery есть функция $ , во фреймворке Prototype – функция $$ , а в библиотеке LoDash очень активно используется функция с названием из одного символа подчеркивания _ .

Объявление функции имеет вид:

  • Передаваемые значения копируются в параметры функции и становятся локальными переменными.
  • Параметры функции копируются в её локальные переменные.
  • Можно объявить новые локальные переменные при помощи var .
  • Значение возвращается оператором return . .
  • Вызов return тут же прекращает функцию.
  • Если return; вызван без значения, или функция завершилась без return , то её результат равен undefined .

При обращении к необъявленной переменной функция будет искать внешнюю переменную с таким именем, но лучше, если функция использует только локальные переменные:

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

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

Обязателен ли «else»?

Следующая функция возвращает true , если параметр age больше 18 . В ином случае она задаёт вопрос посредством вызова confirm и возвращает его результат.

Будет ли эта функция работать как-то иначе, если убрать else ?

Есть ли хоть одно отличие в поведении этого варианта?

Оба варианта функции работают одинаково, отличий нет.

Перепишите функцию, используя оператор ‘?’ или ‘||’

Следующая функция возвращает true , если параметр age больше 18 . В ином случае она задаёт вопрос confirm и возвращает его результат.

Перепишите функцию, чтобы она делала то же самое, но без if , в одну строку. Сделайте два варианта функции checkAge :

  1. Используя оператор ‘?’
  2. Используя оператор ||

решение

Используя оператор || (самый короткий вариант):

Имеется блок кода:

Во время выполнения кода someVar присваивается сначала null, затем выполняется функция someFunction. Мне необходимо, чтобы сначала выполнилась функция, а затем произошло присваивание возвращенного значения переменной someVar. Понимаю, что надо делать через асинхронный вызов, но не понимаю, как правильно это сделать.

Подскажите, пожалуйста, как решить проблему?

Возврат значения функции javascript

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

Возврат функции из функции — как работает замыкание? [дубликат]

На данный вопрос уже ответили:

Учу js и, к сожалению, не понял одну вещь

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

Вопрос 2: почему при вызовах функции currentCount не присваивается 1, ведь

Отмечен как дубликат участником Grundy javascript Участники со знаками javascript могут единолично закрывать вопросы с меткой javascript как дубликаты, а также повторно открывать их при необходимости. 8 май ’18 в 21:57 .

Подобный вопрос задавали ранее и на него уже получен ответ. Если представленные ответы не являются исчерпывающими, пожалуйста, задайте новый вопрос.

Когда в строке var counter = makeCounter(); выполняется функция makeCounter , она присваивает значение 1 своей локальной переменной currentCount и возвращает, но не выполняет анонимную функцию. Так как анонимная функция использует переменную из внешней области видимости, создается «замыкание» (closure), которое соединяет экземпляр переменной currentCount с возвращаемым экземпляром анонимной функции.

Попробую объяснить на пальцах.

Данная строка кода

Делает примерно следующее

Только переменная currentCount не глобальная, а находится в «замыкании», то есть видна исключительно внутри функции. Собственно makeCounter() больше уже не выполняется никогда при вызове counter() , тут сама переменная counter является функцией, которая имеет исключительный доступ к переменной currentCount .

Вся идея создания функции counter() не напрямую через присваивание, а через другую функцию makeCounter() заключается как раз в том, чтобы привязать к ней переменную, которую видит исключительно counter() и которая сохраняет свое значение между вызовами. В других языках программирования существуют так называемые статические переменные — их смысл как раз в том, чтобы сохранять значение между вызовами функции, но при этом быть доступными только внутри функции.

Механим создания замыкания примерно такой. Когда вызывается функция для всех ее локальных переменных выделяется область памяти. Когда функция заканчивает свою работу, то эта область памяти очищается — в этом смысл локальных переменных, они живут, пока исполняется функция. Однако если внутри функции (у вас это makeCounter() ) объявить другую функцию (которая тоже будет как бы локальной переменной-функцией), а потом вернуть объявленную функцию (она у вас анонимная, но назовем ее counter() , по имени переменной в которой она сохранится) вызывающему коду, то область памяти с локальными переменными будет «жить» до тех пор, пока возвращенная функция «живет» в переменной во внешнем коде. При этом к этой области памяти доступ будет иметь только, возвращенная функция. Возвращенная функция и связанная с ней область памяти называется замыканием. Если вызвать makeCounter() повторно, то выделиться новая область памяти, объявится и вернется новая функция, образуется новое замыкание — поэтому counter’ы независимы друг от друга, так как «смотрят» в разные области памяти и «видят» там разные переменные currentCount’ы

Что касается постфикного ( currentCount++ ) и префиксного ( ++currentCount ) инкремента, то @PeterOslon хорошо объяснил.

Возврат значения функции javascript

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

Как использовать return в JavaScript?

Расскажите мне про функцию return как для ребёнка, я не могу понять как её использовать в JavaScript.

  1. Это не функция, а конструкция языка.
  2. Функция в JS обязана что-то вернуть. Даже без return будет возвращено undefined .
    А если нужно вернуть что-то осмысленное, то с помощью этого оператора можно это реализовать, сказав интерпретатору что именно надо вернуть.

У оператора return два назначения.

Во-первых, — это немедленный выход из функции. Т.е. оператор передаёт управление коду, вызвавшему текущую функцию.

Вообще говоря, выход из функции может быть осуществлён несколькими способами:

  • Достижение последнего оператора (код функции попросту заканчивается, аналогично return; или return undefined; )
  • Непосредственный вызов оператора return
  • Выбрасывание ошибки, исключения ( throw ‘something’ , throw new Error(‘Ошибка’) ) В этом случае производится «разворачивание стека», мы опускаемся по стеку вызовов, пока не встретим обработчик исключений (конструкцию try<>catch(e)<> )

Во-вторых, — это возврат значения, так называемого «результата функции».

PS: На самом деле, всё это относится ко многим языкам программирования, не только javascript.

Возврат значения функции javascript

Добрый день. Я новичок в Node , сильно не критикуйте. Столкнулся с проблемой при возврате значения функции при вызове из модуля.

Например есть модуль:

Этот модуль я вызываю в основном файла index.js по средствам require()

В итоге я получаю undefined

Делаю тоже самое с функцией GetTest, все работает нормально.

Если запускать модуль без подключения то все работает нормально, выводятся данные из mysql.

Подскажите что я делаю не так.

Смотрите, если Вы экспортируете модуль, и при этом в конце функции ставите () , другими словами, вызываете функцию, то Вы экспортируете не саму функцию, а результат ее выполнения.

Если же Вы, при экспорте функции, не вызываете ее, другими словами, после ее название не ставите () , тогда Вы экспортируете саму функцию. В результате, Вы сможете запустить ее тогда, когда посчитаете нужным. Например, :

Рабочий пример: две функции экспортируются разными способами и по разному используются. Код модуля: