- return
- Синтаксис
- Описание
- Автоматическая расстановка точек с запятыми
- Примеры
- Прерывание функции
- Инструкция return в JavaScript
- Использование функций в выражении
- Функции в функциях
- Тонкое место return
- Цикл и return
- Применение return в цикле
- Приемы работы с return
- Return a value from window.open
- Как использовать return в JavaScript?
- 2 ответа 2
- Вызываем функции Windows API (и любые другие функции, написанные на языке Си) джаваскриптом из Node.js
return
Оператор return завершает выполнение текущей функции и возвращает её значение.
The source for this interactive example is stored in a GitHub repository. If you’d like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Исходный код данного интерактивного примера хранится в репозитории на GitHub. Если вы хотите поучаствовать в проекте интерактивных примеров, пожалуйста, склонируйте https://github.com/mdn/interactive-examples и отправьте нам запрос на включение ваших изменений.
Синтаксис
Описание
При вызове оператора return в функции её выполнение прекращается. Указанное значение возвращается в место вызова функции. Например, приведённая ниже функция возвращает возведённое в квадрат значение своего аргумента, x (где x – это число):
Если возвращаемое значение не указано, вместо него возвращается undefined .
Следующие выражения всегда прерывают выполнение функции:
Автоматическая расстановка точек с запятыми
На выражение return влияет автоматическая расстановка точек с запятыми (ASI). Разрыв строки не допускается между ключевым словом return и выражением.
трансформируется ASI в:
В консоли появится предупреждение «unreachable code after return statement».
Для того, чтобы избежать данной проблемы (предотвратить ASI), можно использовать скобки:
Примеры
Прерывание функции
Функция немедленно останавливается в точке, где вызывается return .
Инструкция return в JavaScript
Пусть у нас есть функция, которая выводит на экран квадрат переданного числа:
Пусть мы хотим не выводить значение на экран, а записать в какую-нибудь переменную, вот так:
Для этого в JavaScript существует специальная инструкция return, которая позволяет указать значение, которое возвращает функция.
Под словом возвращает понимают то значение, которое запишется в переменную, если ей присвоить вызванную функцию.
Итак, давайте перепишем нашу функцию так, чтобы она не выводила результат на экран, а возвращала его в переменную:
После того, как данные записаны в переменную, их можно, например, вывести на экран:
А можно сначала как-то изменить эти данные, а затем вывести их на экран:
Можно сразу выполнять какие-то действия с результатом работы функции перед записью в переменную:
А можно не записывать результат в переменную, а сразу вывести его на экран:
Сделайте функцию, которая параметром принимает число, а возвращает куб этого числа. С помощью этой функции найдите куб числа 3 и запишите его в переменную result.
Использование функций в выражении
В следующем примере с помощью функции func мы сначала найдем квадрат числа 2, а затем — 3 квадрат числа, сложим эти значения и запишем в переменную:
Сделайте функцию, которая параметром принимает число, а возвращает квадратный корень из этого числа.
С помощью этой функции найдите корень числа 3, затем найдите корень числа 4. Просуммируйте полученные результаты и выведите их на экран.
Функции в функциях
Можно также результат работы одной функции передать параметром в другую, например, вот так мы сначала найдем квадрат числа 2, а затем квадрат результата:
Функции, конечно же, не обязательно должны быть одинаковыми.
Пусть, например, у нас есть функция, возвращающая квадрат числа, и функция, возвращающая куб числа:
Давайте с помощью этих функций возведем число 2 в квадрат, а затем результат этой операции возведем в куб:
Пусть теперь у нас есть функция, возвращающая квадрат числа, и функция, находящая сумму двух чисел:
Найдем с помощью этих функций сумму квадрата числа 2 и сумму квадрата числа 3:
Пусть у вас есть функция, возвращающая квадратный корень из числа, и функция, округляющая дробь до трех знаков в дробной части:
С помощью этих функций найдите квадратный корень из числа 2 и округлите его до трех знаков в дробной части.
Пусть у вас есть функция, возвращающая квадратный корень из числа, и функция, возвращающая сумму трех чисел:
С помощью этих функций найдите сумму корней чисел 2, 3 и 4 и запишите ее в переменную result.
Пусть у вас есть функция, округляющая дробь до трех знаков в дробной части:
С помощью этой функции модифицируйте предыдущую задачу так, чтобы в переменную result записывалась дробь, округленная до 3-х знаков в дробной части.
Тонкое место return
После того, как выполнится инструкция return — функция закончит свою работу. То есть: после выполнения return больше никакой код не выполнится.
Это не значит, что в функции должен быть один return. Но выполнится только один из них.
В следующем примере в зависимости от значения параметра выполнится либо первый, либо второй return:
Что выведется на экран в результате выполнения следующего кода:
Что выведет каждый из алертов в результате выполнения следующего кода:
Что выведет каждый из алертов в результате выполнения следующего кода:
Цикл и return
Пусть у нас есть функция, возвращающая сумму чисел от 1 до 5:
Обратите внимание на то, что return расположен после цикла.
Пусть теперь мы расположим return внутри цикла, вот так:
В этом случае цикл прокрутится лишь одну итерацию и произойдет автоматический выход из функции (ну и заодно из цикла).
А за одну итерацию цикла в переменной sum окажется лишь число 1, а не вся нужная сумма.
Что выведется на экран в результате выполнения следующего кода:
Что хотел сделать автор данного кода? Исправьте ошибку автора.
Применение return в цикле
То, что return расположен внутри цикла, не всегда может быть ошибкой.
В следующем примере сделана функция, которая определяет, сколько первых элементов массива нужно сложить, чтобы сумма стала больше или равна 10:
А в следующем примере сделана функция, которая вычисляет, сколько целых чисел, начиная с 1, нужно сложить, чтобы результат был больше 100:
Напишите функцию, которая параметром будет принимать число и делить его на 2 столько раз, пока результат не станет меньше 10. Пусть функция возвращает количество итераций, которое потребовалось для достижения результата.
Приемы работы с return
Существуют некоторые приемы работы с return, упрощающие код.
Рассмотрим, к примеру, следующий код:
Как вы видите, в данном коде в зависимости от условия в переменную result будет попадать либо одно, либо другое значение. А последней строкой функции содержимое переменной result возвращается через return.
Давайте перепишем этот код в более сокращенной форме, избавившись от ненужной здесь переменной result:
Дана следующая функция:
Перепишите ее в сокращенной форме согласно изученной теории.
Return a value from window.open
We recently discovered that Chrome no longer supports window.showModalDialog which is problematic because our enterprise application uses this method.
There is, apparently, a short term workaround that allows you to restore showModalDialog but it involves modifying the registry which is too complicated (and risky) four our average user. Therefore I’m not a big fan of this workaround.
The long term solution is obviously to remove all calls to this obsolete method and replace them with a convenient jQuery plugin (such as VistaPrint’s Skinny Modal Dialog plugin, for example. Other suggestions are welcome by the way).
The typical scenario we use the modal dialog is to ask the user for Yes/No confirmation before executing an action that cannot be undone, ask the user to agree to terms and condition before proceeding, etc. Typically the onclick event on the «Yes» or «Ok» button in the modal dialog looks like this:
Similarly, the «Cancel» or «No» button looks like this:
The fact that we can return a value from the dialog is very convenient because it allows the «parent» window to be notified whether the user has clicked the «Ok» or the «Cancel» button like so:
The last thing I’m going to mention about the showModalDialog is that it works great even when the document displayed in the dialog is from a different domain. It’s very common for us to have our javascript running from http://the-client.com but the «Terms of Service» web page is from http://the-enterprise-vendor.com
I need a temporary solution that I can deploy ASAP while we work on the long term solution. Here are my criteria:
- minimal code change in existing JavaScript
- the pop up window must be able to return a value to the «parent». Typically this value is a Boolean but it could be any simple type (e.g.: string, int, etc.)
- solution must work even if the URL of the content is from different domain
Here’s what I have so far:
1) Add the following method in my JavaScript:
As you can see in this method, I try to make the pop up window look as similar to a dialog as possible by hiding the menu and the toolbar, I setup a time every 500 milliseconds to check if the window has been closed by the user and if so, get the ‘returnValue’ and invoke a callback.
2) replace all calls to showModalDialog with the following:
The fourth parameter to the method is the callback where I check if the user has clicked the «Ok» button before allowing her to proceed.
I know it’s a long question but basically it boils down to:
Как использовать return в JavaScript?
Расскажите мне про функцию return как для ребёнка, я не могу понять как её использовать в JavaScript.
2 ответа 2
- Это не функция, а конструкция языка.
- Функция в JS обязана что-то вернуть. Даже без return будет возвращено undefined .
А если нужно вернуть что-то осмысленное, то с помощью этого оператора можно это реализовать, сказав интерпретатору что именно надо вернуть.
У оператора return два назначения.
Во-первых, — это немедленный выход из функции. Т.е. оператор передаёт управление коду, вызвавшему текущую функцию.
Вообще говоря, выход из функции может быть осуществлён несколькими способами:
- Достижение последнего оператора (код функции попросту заканчивается, аналогично return; или return undefined; )
- Непосредственный вызов оператора return
- Выбрасывание ошибки, исключения ( throw ‘something’ , throw new Error(‘Ошибка’) ) В этом случае производится «разворачивание стека», мы опускаемся по стеку вызовов, пока не встретим обработчик исключений (конструкцию try<>catch(e)<> )
Во-вторых, — это возврат значения, так называемого «результата функции».
PS: На самом деле, всё это относится ко многим языкам программирования, не только javascript.
Вызываем функции Windows API (и любые другие функции, написанные на языке Си) джаваскриптом из Node.js
Со вчерашнего дня, господа, можно написать вот такой скрипт:
и, запустив его в Windows, получить желаемый результат — диалоговое окно Windows.
Это стало возможным потому, что модуль (обёртку вокруг той необыкновенно полезной библиотеки которая используется для вызова библиотек на языке Си не менее чем других языках) вчера портировали на Windows.
Следует, разумеется, помнить о том, что в Windows API используются строки в формате а джаваскриптовые строки Node.js хранит Воплощением этой разницы является в моём примере преобразователь аналог одноимённого макро, описанного
Ясное дело, что на Windows API свет клином не сошёлся: модуль можно использовать для вызова какой угодно библиотеки, написанной на языке Си или соблюдающей принятый в Си способ вызова функций (например, в Си++ это достигается директивою
Что означает этот шаг эволюции возможностей Node.js?
Напомню предсказание, сделанное мною меньше месяца назад — шестнадцатого декабря 2011 года:
В настоящее время будущее Node.js ещё не достаточно лучезарно, поскольку ещё только этот движок существует не только под Linux, под Мак и под Соляркою, но также и под Windows.
Следует ожидать мощного синергического толчка в тот момент, когда код модулей для Node.js начнут сочинять также и те разработчики на JavaScript, у которых на рабочем компьютере стоит Windows. По моим оценкам, для этого не достаточно портировать на Windows один только сам движок Node.js; потребуется также, по меньшей мере, вот что:
- Плавная работа пакетного менеджера npm. В частности, будет необыкновенном полезным появление у разработчиков модулей возможности поставлять заранее скомпилированные модули для win32 и win64: нельзя же полагаться на то, что у каждого конечного пользователя стоят средства разработки (например, Visual Studio 2010 Express). Понятно, что и разработчики модулей должны взяться за ум, а не то даже команду npm install zip нельзя под Windows подать без того, чтобы наткнуться на симлинк внутри тарболла. (Или автор скрипта мог бы получше предусмотреть это.)
- Появление возможности оскриптовывания произвольной системной библиотеки. (Появится, вероятно, после портирования на Windows.) Только отсюда протянется тропка к сотворению GUI.
- Появление возможности работать с БД файлового (а не клиент-серверного) типа. (Появится, вероятно, после портирования на Windows.)
И месяца не прошло, как второй из этих трёх пунктов реализовался. Любая библиотека может быть оскриптована джаваскриптами. Соответственно, приложениям на Node.js под Windows стала доступна вся мощь системных API, а кросс-платформенные приложения могут невозбранно обращаться ко кросс-платформенным библиотекам, таская их с собою.
Первый из этих трёх пунктов (касавшийся как раз таскания библиотек с собою) не реализовался в том виде, в каком я мечтал о нём: пакетный менеджер npm всё ещё не обеспечивает возможность доставки только того скомпилированного кода, который нужен конкретной системе. Но у меня появился новый повод для оптимизма после того, как я увидел, что разработчикам модуля удалось обойти нехватку такой возможности. Их модуль содержит один и тот же код, скомпилированный под полдесятка различных платформ:
а скрипт lib/bindings.js во время вызова модуля оглядывается, соображая, куда же попал он, и подбирает нужный двоичный код:
Как видно, работает ничуть не хуже; папка «compiled» вот только занимает ≈700 килобайтов, но при нынешних объёмах дисков и скоростях сетей об этом можно позабыть.