Функция в javascript: Функции — JavaScript | MDN

Содержание

Создание устойчивой функции в Azure с помощью JavaScript

  • Статья
  • Чтение занимает 7 мин

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

В этой статье описано, как использовать расширение Функций Azure в Visual Studio Code, чтобы локально создать и тестировать устойчивую функцию hello world. Эта функция будет организовывать и объединять в цепочку вызовы других функций. Затем вы опубликуете код функции в Azure.

Предварительные требования

Для работы с этим руководством сделайте следующее:

  • Установите Visual Studio Code.

  • Установите расширение Функции Azure для VS Code.

  • Убедитесь, что используется последняя версия Azure Functions Core Tools.

  • Для работы Устойчивых функций требуется учетная запись хранения Azure. Вам понадобится подписка Azure.

  • Убедитесь, что установлена версия Node.js 10.x или 12.x.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Создание локального проекта

В этом разделе вы используете Visual Studio Code. чтобы создать локальный проект Функций Azure.

  1. В Visual Studio Code нажмите клавишу F1 (или Ctrl/Cmd+Shift+P), чтобы открыть палитру команд. В палитре команд найдите и щелкните Azure Functions: Create New Project....

  2. Выберите расположение пустой папки для проекта и нажмите кнопку Выбрать.

  3. Следуя инструкциям, введите следующие сведения:

    promptЗначениеОписание
    Select a language for your function app project (Выберите язык для проекта приложения-функции)JavaScriptСоздание локального проекта службы «Функции» для Node.js
    Выбор версииФункции Azure версии 4Этот параметр отображается, только если вы еще не установили Core Tools. В этом случае Core Tools устанавливается при первом запуске приложения.
    Select a template for your project’s first function (Выберите шаблон для первой функции вашего проекта)Пропустить
    Select how you would like to open your project (Выберите, как вы хотели бы открыть свой проект)Открыть в текущем окнеПовторно открывает VS Code в выбранной папке.

При необходимости Visual Studio Code устанавливает Azure Functions Core Tools. Кроме того, создается проект приложения-функции в папке. Проект будет содержать файлы конфигурации host.json и local.settings.json.

В корневой папке также создается файл package.json.

Установка пакета npm для расширения «Устойчивые функции»

Для работы с Устойчивыми функциями в приложении-функции Node.js используется библиотека с именем durable-functions.

  1. Используйте меню Представление или сочетание клавиш CTRL+SHIFT+’, чтобы открыть новый терминал в VS Code.

  2. Установите пакет npm durable-functions, выполнив команду npm install durable-functions в корневом каталоге приложения-функции.

Создание функций

В самом простом приложении Устойчивых функций есть три функции:

  • функция оркестратора
     — описывает рабочий процесс и координирует другие функции;
  • функция действия — вызывается функцией оркестратора, выполняет работу и при необходимости возвращает значение;
  • функция клиента — обычная функция Azure, которая запускает функцию оркестратора. В этом примере используется функция, активируемая по HTTP.

Функция оркестратора

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

  1. В палитре команд найдите и щелкните Azure Functions: Create Function....

  2. Следуя инструкциям, введите следующие сведения:

    promptЗначениеОписание
    Выбор шаблона для функцииОркестратор Устойчивых функцийСоздание оркестрации Устойчивых функций
    Provide a function name (Укажите имя функции)HelloOrchestratorИмя устойчивой функции

Итак, вы добавили оркестратор для координации функций действия. Откройте файл HelloOrchestrator/index.js и изучите функцию оркестратора. Каждый вызов context.df.callActivity приводит к вызову функции действия с именем Hello.

Теперь нужно добавить функцию действия Hello, на которую ведет эта ссылка.

Функция действия

  1. В палитре команд найдите и щелкните Azure Functions: Create Function....

  2. Следуя инструкциям, введите следующие сведения:

    promptЗначениеОписание
    Выбор шаблона для функцииДействие Устойчивых функцийСоздание функции действия
    Provide a function name (Укажите имя функции)ПриветИмя функции действия

Теперь вы добавили функцию действия Hello, которая вызывается оркестратором. Откройте файл Hello/index.js и убедитесь, что эта функция принимает имя в качестве входных данных и возвращает приветствие. Функция действия отвечает за все реальные действия, включая обращение к базе данных и выполнение вычислений.

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

Функция клиента (начальный объект HTTP)

  1. В палитре команд найдите и щелкните Azure Functions: Create Function. ...

  2. Следуя инструкциям, введите следующие сведения:

    promptЗначениеОписание
    Выбор шаблона для функцииНачальный объект HTTP Устойчивых функцийСоздание функции начального объекта HTTP
    Provide a function name (Укажите имя функции)DurableFunctionsHttpStartИмя функции действия
    Уровень авторизацииАнонимныеДля примера разрешите вызывать функцию без проверки подлинности.

Итак, вы добавили активируемую вызовом HTTP функцию, которая запускает оркестратор. Откройте файл DurableFunctionsHttpStart/index.js и убедитесь, что эта функция запускает оркестрацию с помощью client.startNew. После этого она должна вызывать client.createCheckStatusResponse, чтобы вернуть ответ HTTP с URL-адресами, которые позволяют отслеживать новую оркестрацию и управлять ею.

Теперь у вас есть готовое приложение Устойчивых функций, которое можно выполнить локально и развернуть в Azure.

Локальное тестирование функции

Основные инструменты службы «Функции Azure» позволяют запускать проекты функций Azure на локальном компьютере разработчика. Вам будет предложено установить эти инструменты при первом запуске функции из Visual Studio Code.

  1. Чтобы протестировать созданную функцию, установите точку останова в коде функции действия Hello (файл Hello/index.js). Нажмите клавишу F5 или выберите действие Debug: Start Debugging на палитре команд, чтобы запустить проект приложения-функции. Выходные данные основных инструментов отображаются на панели Terminal (Терминал).

    Примечание

    См. сведения об отладке в руководстве по диагностике Устойчивых функций.

  2. Для выполнения Устойчивых функций требуется учетная запись хранения Azure. Когда VS Code предложит выбрать учетную запись хранения, щелкните Выбрать учетную запись хранения.

  3. Следуя инструкциям, укажите следующие сведения, чтобы создать новую учетную запись хранения в Azure.

    promptЗначениеОписание
    Выбор подпискиимя вашей подпискиВыбор подписки Azure
    Выбор учетной записи храненияСоздание новой учетной записи хранения
    Ввод имени новой учетной записи храненияуникальное имяИмя учетной записи хранения для создания
    Выбор группы ресурсовуникальное имяИмя создаваемой группы ресурсов
    Выберите расположениеregionВыбор ближайшего региона
  4. На панели Terminal (Терминал) скопируйте URL-адрес конечной точки функции, активируемой HTTP-запросом.

  5. Отправьте запрос HTTP POST к конечной точке URL-адреса, используя браузер или средства наподобие Postman или cURL. Последний сегмент замените именем функции оркестратора (HelloOrchestrator в нашем примере). URL-адрес должен выглядеть приблизительно так: http://localhost:7071/api/orchestrators/HelloOrchestrator.

    Полученный ответ является начальным результатом функции HTTP, который сообщает об успешном начале работы устойчивой оркестрации. Он еще не конечный результат оркестрации. Ответ включает несколько полезных URL-адреса. Теперь запросите состояние оркестрации.

  6. Скопируйте значение URL-адреса для statusQueryGetUri, вставьте его в адресную строку панели браузера и выполните запрос. Кроме того, вы можете воспользоваться Postman для выдачи запроса GET.

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

    {
        "name": "HelloOrchestrator",
        "instanceId": "9a528a9e926f4b46b7d3deaa134b7e8a",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "Hello Tokyo!",
            "Hello Seattle!",
            "Hello London!"
        ],
        "createdTime": "2020-03-18T21:54:49Z",
        "lastUpdatedTime": "2020-03-18T21:54:54Z"
    }
    
  7. В VS Code нажмите клавиши Shift + F5, чтобы остановить отладку.

Убедившись, что функция выполняется правильно на локальном компьютере, опубликуйте проект в Azure.

Прежде чем публиковать приложение, необходимо войти в Azure.

  1. Если вы не выполнили вход, щелкните значок Azure на панели действий. Затем в области Ресурсы выберите Вход в Azure….

    Если вы уже выполнили вход и видите существующие подписки, перейдите к следующему разделу. Если у вас еще нет учетной записи Azure, выберите Создать учетную запись Azure…. Учащиеся могут выбрать Создать учетную запись Azure для учащихся….

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

  3. Выполнив вход, можно закрыть новое окно браузера. Подписки, принадлежащие учетной записи Azure, отображаются на боковой панели.

Создание приложения-функции в Azure

В этом разделе показано, как создать приложение-функцию и связанные ресурсы в подписке Azure.

  1. Щелкните значок Azure на панели действий. Затем в области Ресурсы щелкните значок + и выберите вариант Создать приложение-функцию в Azure.

  2. Введите следующие сведения по соответствующим запросам:

    promptВыбор
    Выбор подпискиВыберите подписку, которую нужно использовать. Эта подсказка не отобразится, если в области Ресурсы отображается только одна подписка.
    Ввод глобально уникального имени для приложения-функцииВведите имя, допустимое в пути URL-адреса. Имя, которое вы вводите, проверяется, чтобы убедиться, что оно уникально в функциях Azure.
    Выбор стека среды выполненияВыберите версию языка, которая запускалась локально.
    Выбор расположения для новых ресурсовДля повышения производительности выберите регион рядом с вами.

    Расширение показывает на панели Azure: журнал действий состояние отдельных ресурсов по мере их создания в Azure.

  3. После завершения создания в вашей подписке будут созданы приведенные ниже ресурсы Azure. Имена ресурсов основаны на имени приложения-функции.

    • Группа ресурсов — логический контейнер связанных ресурсов.
    • Учетная запись хранения Azure уровня «Стандартный» для сохранения состояния и других сведений о проектах.
    • приложение-функцию — среду для выполнения кода функции. Приложение-функция позволяет группировать функции в логические единицы и упростить развертывание, масштабирование и совместное использование ресурсов, а также управление ими в рамках единого плана размещения.
    • План службы приложений, который определяет базовый узел для приложения-функции.
    • Экземпляр Application Insights, подключенный к приложению-функции, который отслеживает использование функций в приложении.

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

    Совет

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

Развертывание проекта в Azure

Важно!

Развертывание в существующем приложении-функции всегда перезаписывает содержимое этого приложения в Azure.

  1. Щелкните значок Azure на панели действий, а затем в области Рабочая область выберите папку проекта и нажмите кнопку Развернуть….

  2. Выберите Развернуть в приложение-функцию…, выберите только что созданное приложение-функцию и нажмите Развернуть.

  3. После завершения развертывания выберите Просмотреть выходные данные, чтобы просмотреть результаты создания и развертывания, включая созданные ресурсы Azure. Если вы пропустили уведомление, щелкните значок колокольчика в правом нижнем углу, чтобы снова просмотреть его.

Тестирование функции в Azure

  1. Скопируйте URL-адрес HTTP-триггера на панели Output (Выходные данные). URL-адрес для вызова функции, активируемой HTTP-запросом, должен быть указан в таком формате: http://<functionappname>.azurewebsites.net/api/orchestrators/HelloOrchestrator

  2. Вставьте этот URL-адрес HTTP-запроса в адресную строку браузера. При использовании опубликованного приложения ответ состояния должен быть таким же, как и ранее.

Дальнейшие действия

Вы создали и опубликовали приложение устойчивой функции JavaScript с помощью Visual Studio Code.

Дополнительные сведения о распространенных шаблонах устойчивых функций

Функции JavaScript в формах опроса—ArcGIS Survey123

Можно использовать функцию pulldata() для вызова функций JavaScript, что позволяет использовать передовые методы и логику, которые не доступны при работе только с XLSForm.

Вы можете управлять функциями JavaScript и редактировать их на вкладке Скрипты в Survey123 Connect. На этой вкладке вы можете создать файл JavaScript, просмотреть код и протестировать функцию. Эта вкладка не является полной заменой интегрированной среды разработки (IDE), которая может обеспечивать проверку кода и анализ передового опыта, чтобы помочь в разработке функций JavaScript, но предназначена для помощи в интеграции этих функций в Survey123.

Инструменты-скрипты в Survey123 Connect

Следующие инструменты доступны в меню на вкладке Скрипты в Survey123 Connect:

  • Файлы скриптов — Показывает все файлы JavaScript, находящиеся в папке Scripts вашего опроса. Выберите файл для просмотра и редактирования.
  • Открыть папку скриптов — Запускает файловый браузер в том месте, где находится папка Scripts вашего опроса.
  • Файл нового скрипта — Создает файл скрипта в папке Scripts вашего опроса. Введите имя файла и щелкните Создать.
  • Выбрать функцию — Выделяет первую функцию в открытом файле и представляет параметры для тестирования.
  • Сохранить — Сохраняет изменения в открытом файле.
  • Запустить внешний редактор — Запускает системную IDE JavaScript по умолчанию с открытым файлом.

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

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

Базовый синтаксис

Вы можете вызывать пользовательские функции JavaScript для возврата значений. Используйте следующий синтаксис для вызова пользовательских функций JavaScript с помощью функции pulldata():

pulldata(«@javascript», «yourJSFile.js», «yourFunction», «parameter1», «parameter2»)

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

Функция pulldata() также может извлекать определенные значения из объекта JSON, созданного функцией JavaScript. В следующем примере поле attributes.ZIP_CODE извлекается из функции JavaScript, выполняемой в вопросе json_output:

pulldata(«@json», ${json_output}, «attributes.ZIP_CODE»)

Подсказка:

Для пространственных и атрибутивных запросов к векторным слоям ArcGIS рассмотрите возможность использования функции pulldata(«@layer») вместо pulldata(«@javascript»). Синтаксис pulldata(«@layer») специально разработан для запросов векторного слоя и поддерживается для общедоступных опросов. Для получения дополнительной информации см. Запрос к векторному слою.

Повторы

Можно передать все значения из одного повтора в ваши функции JavaScript. Функция pulldata(«@javascript») поддерживает два стиля применения для извлечения значений из повтора. Тот, что будет использоваться, зависит от того, хотите ли вы, чтобы ваша функция JavaScript взаимодействовала с одним полем или со многими полями в повторе.

Если вопрос из повтора передается в качестве параметра функции, то функция JavaScript получает массив значений из указанного вопроса следующим образом:

pulldata(«@javascript», «yourJSFile.js», «yourFunction», ${question1})

Если имя повтора передается в качестве параметра функции, функция JavaScript получает параметр в виде массива строк всех значений в повторе следующим образом:

pulldata(«@javascript», «yourJSFile.js», «yourFunction», ${repeat1}, «question1»)

Каждый из них создает объект JSON с отдельными вопросами, как свой свойства этого объекта.

Доступ к значениям в повторах с помощью pulldata(«@javascript») не поддерживается в веб-приложении Survey123. Вы можете собирать значения для одного вопроса в повторе в веб-приложении, используя join() для преобразования списка значений в строку, разделенную символами, а затем разбивать значения в функции JavaScript.

Как в Survey123 версии 3.14 пустые значения, передаваемые в функцию JavaScript, теперь могут привести к возврату undefined или null. Поэтому вам следует написать функции JavaScript, чтобы учесть возможность наличия значения undefined.

Прочие свойства

Иногда, особенно при использовании JavaScript для доступа к веб-сервисам и защищенным сервисам ArcGIS, вам могут понадобиться свойства, недоступные через стандартную XLSForm. Survey123 включает перечисленные ниже свойства, которые можно извлечь с помощью следующей структуры:

pulldata(«@property», «propertyname»)

  • portalurl
  • token
  • online – значение Boolean, указывающее, подключено ли устройство к сети.
  • language – язык, используемый в настоящее время в опросе.
  • locale – Объект локали, используемый в текущем опросе. Это свойство применяется только для функции JavaScript.
  • localeinfo – объект AppStudio LocaleInfo, используемый в текущем опросе, содержащий код языка в различных обозначениях. Это свойство применяется только для функции JavaScript.
  • timezone – код часового пояса.
  • utcoffset – смещение в часах от универсального координированного времени (UTC) для местного часового пояса.
Вы можете использовать эти свойства вместе с функцией pulldata(«@javascript»). В следующем примере свойство token используется для создания токена для сервиса объектов:
pulldata("@javascript", "myJSFunctions.js", "returnFirstIntersectingFeature", "https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis/rest/services/USA_ZIP_Codes_2016/FeatureServer/0", string(${location}), "*", pulldata("@property", "token"), true)

Известные ограничения

Ниже приведены известные ограничения при использовании функций JavaScript в формах опроса:

  • Document Object Model (DOM) не поддерживается.
  • Среды JQuery, Ember и Angular не поддерживаются.
  • У вас нет доступа к локальным файлам.
  • Асинхронные вызовы не поддерживаются.
  • Функции JavaScript поддерживаются только в формах, заполненных пользователями в той же организации, что и автор формы.
  • Функции JavaScript не поддерживаются для общедоступных опросов.
  • Функция pulldata(«@javascript») не может вызываться внутри функции pulldata(«@json») в веб-приложении Survey123.

Отзыв по этому разделу?

Функции JavaScript, объясняемые созданием рецепта [Интерактивное объяснение]

Если вы когда-либо готовили по рецепту, то вы понимаете функции в JavaScript

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

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

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

Чтобы понять этот учебник, вам нужно сначала понять переменные в JavaScript. Ознакомьтесь с моим руководством по переменным здесь, если вам нужно.

Что такое функция?

Давайте сначала подумаем об общей концепции приготовления пищи по рецепту. Использование рецепта означает, что:

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

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

Эти ингредиенты называются параметрами . Вы можете увидеть их на схеме ниже.

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

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

Пример 1. Кипяток

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

Итак, чтобы предложение имело смысл, параметры вода и горшок должны быть числами, а параметр паста должна быть строкой.

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

Вот полный пример. Мы будем варить спагетти в 30 унций воды в 120 унций кастрюле. Наведите курсор или нажмите на каждую часть функции, чтобы узнать больше о каждой части.

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

«Мы собираемся вскипятить 30 унций воды со спагетти в кастрюле на 120 унций»

Одно небольшое замечание. Вы заметили, что мы ввели здесь новый термин? Мы представили аргумент . Аргумент — это значение, которое используется, когда мы вызываем функцию.

Разница в том, что эти три параметра не подлежат обсуждению. Вода. Макароны. Горшок. Но объем воды? Тип пасты? Размер горшка? Вы можете изменить их. Это аргументы.

Пример 2. Приготовление бутерброда

В отличие от рецепта кипения воды, многие функции имеют значение , возвращающее значение . Это означает, что они выводят одно значение, массив, объект или другую функцию. Они не просто изменяют переменные, которые уже существуют в вашем скрипте.

Мы собираемся создать функцию makeSandiwch, которая будет принимать три параметра: мясо, овощи и хлеб. Он выведет готовый бутерброд. Каждый из них должен быть строкой. Довольно просто. Вот эта функция.

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

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

Наведите или щелкните каждую часть кода, чтобы отследить значения.

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

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

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

Понравилось ли вам это?

Ознакомьтесь с остальными руководствами CodeAnalogies по HTML, CSS, JavaScript, если вам нравится этот стиль обучения.

[JS] Как работает оператор return в функциях

Этот пост доступен для бесплатного чтения всем благодаря инвестициям Подписчики блога Mindsers сделали в нашем независимом публикация. Если эта работа важна для вас, я приглашаю вас стать подписчиком Cегодня.

Чтобы завершить функцию, JavaScript использует оператор return . Оператор return очень прост. Это одна из первых вещей, которую вы узнаете на курсе кодирования.

Но вы не должны недооценивать его способность помогать вам писать более чистый и более производительный код (и наоборот, если вы недостаточно хорошо его освоили).

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

Резюме

Как работает оператор , возвращающий ⁣?

  • Как насчет функций без оператора возврата?
  • Оператор return является «блокирующим» оператором

Лучшее использование оператора return

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

    Первое правило, которому мы постараемся следовать: одна функция = одна ответственность. Никогда не более одной ответственности. Это сделает ваш код намного лучше.

     функция addOneTo(a) {
        постоянный результат = а + 1
        
        вернуть результат
    } 

    Функция addOneTo(a) добавляет 1 к значению, содержащемуся в переменной a . Я подробно объясняю переменные JavaScript в другом посте, и если вы еще не знакомы с ними, я настоятельно рекомендую вам прочитать его.

    Оператор return позволяет нам вернуть результат сложения следующим образом: вернуть результат .

    Другими словами, return оператор позволяет нам четко указать интерпретатору JavaScript, какое значение вернет эта функция. В нашем примере мы используем две переменные. Мы не хотим возвращать a , только результат .

    Как насчет функций без оператора возврата?

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

    Проблема в том, что в JavaScript нет процедур .

    Чтобы решить эту проблему, JavaScript позволяет нам возвращать «неопределенное» значение. Это не определено. Мы не знаем, каково значение, поэтому можем сказать, что оно пусто.

     функция prepareObject(obj) {
        объект.connect({
          // ...
        })
        obj.использовать({
          // ...
        })
        
        вернуть неопределенное
    } 

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

    Функция prepareObject выполняет свои операторы, и в конце мы говорим, что функция возвращает неопределенное значение . Для нас это означает, что мы ничего не возвращаем, но интерпретатор доволен, потому что вы все равно возвращаете значение.

    Если вы попытаетесь запустить функцию prepareObject , вы увидите, что она возвращает значение undefined .

    Однако есть несколько способов упростить код. Во-первых, оставьте значение пустым, например:

     function prepareObject(obj) {
        объект.connect({
          // ...
        })
        obj.использовать({
          // ...
        })
        
        возвращаться
    } 

    Поскольку ничего не возвращается, интерпретатор JavaScript понимает, что вы хотите вернуть undefined и делает это автоматически.

    Вы также можете вообще опустить оператор, например:

     function prepareObject(obj) {
        объект.connect({
          // ...
        })
        obj.использовать({
          // ...
        })
    } 

    Если вы думаете, что это процедура, то я понимаю почему, но это не так. Попробуйте, запустите функцию prepareObject , вы увидите, что она возвращает значение undefined .

    Оператор return является «блокирующим» оператором

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

     функция doComplicatedStuff(obj) {
        объект.connect({
          // ...
        })
        
        вернуть объект
        
        obj.использовать({
          // ...
        })
    } 

    Предыдущий код действителен. Единственное, что вы должны помнить здесь, это то, что возвращает — это «блокирующий» оператор в области действия родительской функции.

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

    Код, расположенный после оператора return , называется «мертвым кодом».

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

    Если вы спросите себя, почему мы будем использовать return; вместо того, чтобы опустить оператор, или если вы задавались вопросом, почему мы должны писать код после верни , эта часть поста для тебя.

    Как только вы поймете эти две идеи, вы сможете лучше использовать оператор return . Хорошее использование возвращает для лучшей читаемости кода.

    Как можно скорее выйти из функции

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

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

    Способ уменьшить сложность кода — уменьшить количество обрабатываемых данных. Оператор return может помочь нам в этом. Давайте посмотрим пример.

     функция byOrder(a, b) {
        пусть результат = ноль
        
        если (а.порядок > б.порядок) {
            результат = 1
        }
        
        если (a.order < b.order) {
            результат = -1
        }
        
        если (a.order == b.order) {
            результат = 0
        }
        
        вернуть результат
    } 

    Эта функция используется, чтобы сообщить функции JavaScript array.sort , как сортировать массив. Он используется так: array.sort(byOrder) .

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

    1. Во-первых, я вижу, что есть переменная результата , инициализированная значением null , но значение изменится, потому что мы используем оператор let . Чтобы узнать больше об этом шаге, прочитайте подробный пост о переменных JavaScript.
    2. Одно условие: если порядок a превосходит b . Именно в нашем случае мы изменяем значение результата на 1 .
    3. Новое условие: если порядок a меньше b . Это не наш случай, нет нужды вдаваться в подробности этого состояния.
    4. Новое условие: если порядок a равен b . Это не наш случай, нет необходимости вдаваться в подробности этого состояния.
    5. Мы видим, что оператор return хочет вернуть значение переменной result . Функция возвращает 1 , потому что мы находимся в области действия первого условия.

    Нам пришлось прочитать (и понять) больше кода, чем необходимо, чтобы убедиться, что мы поняли, что делает эта функция. Пункты 3 и 4 выше не обязательны, но мы все равно должны выполнить их в нашем мозгу. Мы также должны были помнить, что произошло до этих шагов, чтобы знать, что возвращать.

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

     функция byOrder(a, b) {
        если (а.порядок > б.порядок) {
            вернуть 1
        }
        
        если (a.order < b.order) {
            возврат -1
        }
        
        вернуть 0
    } 

    Эта новая функция делает то же самое. Она имеет ту же сигнатуру, что и первая функция. Попробуем прочитать его сейчас (напоминаем, a.порядок равен 10 и b.порядок равен 0 ) :

    1. Сначала я ввожу функцию и тут же возникает условие: если порядок a превосходит b . Так и есть, в нашем случае, поэтому мы возвращаем значение 1.

    Так блокируется оператор return , и он перестает выполнять функцию, в нашем конкретном случае остальной код «мёртв». Нет смысла это читать. Нам не нужно понимать остальную часть функции, чтобы понять, что она делает в нашем случае.

    Нашему мозгу нужно учитывать гораздо меньше параметров во время чтения. Это менее сложно. Наводит на мысли о охраннике со Свифтом.

    И так почти во всех случаях. Попробуйте выполнить упражнение для a.order === b.order , даже если это последние проверенные условия, вторая функция менее сложна.

    Сделать оператор

    else более полезным

    Еще один способ улучшить код по заказу — использовать ключевые слова еще и еще... если .

     функция byOrder(a, b) {
        пусть результат = ноль
        
        если (а.порядок > б.порядок) {
            результат = 1
        } иначе если (a. order < b.order) {
            результат = -1
        } еще {
            результат = 0
        }
        
        вернуть результат
    } 

    Мы имитируем поведение решения с возвратом , потому что следующие условия не выполняются, как только найдено соответствующее условие.

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

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

     функция byOrder(a, b) {
        если (а.порядок > б.порядок) {
            вернуть 1
        } иначе если (a.order < b.order) {
            возврат -1
        } еще {
            вернуть 0
        }
    } 

    В этом конкретном случае вам нужно выбрать: либо иначе , либо вернуть . Использование return отменяет преимущества использования иначе , а также усложняет код. Этот код не имеет никакой другой цели, кроме как показать, что человек, который написал, не очень-то разбирался в тонкостях иначе оператор и возвращают оператор . Не делай этого.

    Используя в этой функции только return , вы удаляете несколько слов. Но что более важно, вы удаляете полную область видимости (в последнем или ) и удаляете уровень отступа, который, как мы видели ранее, помогает сделать ваш код более понятным и менее сложным.

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

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


    Короче говоря, оператор return ( return ) позволяет вернуть значение, определенное или нет, в родительский контекст функции.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *