Если переменные и константы хранят состояние программы, то функции определяют ее действия. По сути функция представляет именованный кусок кода, который можно многократно использовать в различных частях программы.
Определение функции
Формальное определение функции выглядит следующим образом:
тип имя_функции(параметры)
Первая строка представляет заголовок или сигнатуру функции. Вначале указывается возвращаемый тип функции. Если функция не возвращает никакого значения, то используется тип void .
Затем идет имя функции, которое представляет произвольный идентификатор, к которому применяются те же правила, что и к именованию переменных.
После имени функции в круглых скобках идет перечисление параметров. Функция может не иметь параметров, в этом случае указываются пустые скобки.
После заголовка функции в фигурных скобках идет тело функции, которое содержит выполняемые выражения.
В предыдущих статьях уже использовались как минимум две функции. Так, каждая программа на языке Си должна содержать функцию main . Также для вывода строки на консоль применялась функция printf() . Теперь определим свою простейшую функцию:
Что такое функции в программировании?
#include void hello() < printf(«Hello!n»); >int main(void)
Кроме стандартной функции main здесь также определена функция hello . Эта функция имеет тип void , то есть фактически она ничего не возвращает. Она не имеет никаких параметров, поэтому после названия функции идут пустые круглые скобки. И все, что делает данная функция, — просто выводит на консоль строку «Hello!».
Но если мы запустим сейчас программу на выполнение, то никаких строк на консоль не будет выводиться, более того наша функция hello() не будет выполняться..
Вызов функции
Для выполнения функции ее необходимо вызвать. Вызов функции осуществляется в форме:
имя_функции(аргументы);
После имени функции указываются скобки, в которых перечисляются аргументы — значения для параметров функции.
В любой программе должна быть как минимум одна функция, которая имеет фиксированное имя main() . Именно с функции main начинается выполнение. Поэтому если мы хотим выполнить функцию hello, то нам надо ее вызвать в функции main.
#include // определение функции void hello() < printf(«Hello!n»); >int main(void) < hello(); // вызов функции hello(); // вызов функции return 0; >
В данном случае функция hello вызывается два раза. В этом и состоит прелесть функция: мы можем вынести некоторое общее действие, которое может состоять из нескольких строк, в отдельную функцию и затем вызывать многократно в различных местах программы. Поскольку функция hello() не имеет никаких параметров, то в при вызове ей не передается никаких аргументов — указываются просто пустые круглые скобки:
hello();
В итоге программа два раза выведет строку «Hello».
Прототип или описание функции
Здесь стоит учесть важный момент — компилятор должен знать о функции до ее вызова. Поэтому вызов функции должен происходить после ее определения, как в случае выше. В некоторых языках это не имеет значение, но в языке Си это играет большую роль. И если, к примеру, мы сначала вызовем, а потом определим функцию, то мы можем получить ошибку на этапе компиляции, как в следующем случае:
Основы Программирования — #4 — Функции
#include int main(void) < hello(); hello(); return 0; >void hello()
Некоторые компиляторы могут скомпилировать данный код, но тем не менее при компиляции сгенерируют предупреждение.
Но есть и другой способ, который заключается в использовании описания функции. Описание функции еще называют прототипом . Формальное определение прототипа выглядит следующим образом:
тип имя_функции(параметры);
Фактически это заголовок функции. То есть для функции hello прототип будет выглядеть следующим образом:
void hello();
Применим прототип функции:
#include // описание void hello(void); int main(void) < hello(); hello(); return 0; >// определение void hello()
В данном случае несмотря на то, что определение функции идет после ее вызова, но так как ее описание идет до вызова, то компилятор уже будет знать о функции hello, и никаких проблем в работе программы не возникнет.
Стоит отметить, что если функция не принимает никаких параметров, то в ее прототипе в скобках указывается void , как в примере выше с функцией hello .
Источник: metanit.com
Функции
Функция — это блок кода, который может быть именован и вызван повторно. Иногда функцию ещё называют подпрограммой.
Обычной переменной присваивают число, строку или массив, а затем получают его обратно, обратившись к значению по имени переменной. Функции устроены похожим образом. Это тоже переменная, только вместо строки или числа в функции хранится блок кода, который вызывается при использовании этой «переменной».
Функция — очень мощный инструмент повторного использования кода. Создав свою функцию и записав туда необходимый код, вы сможете вызывать и использовать его столько раз, сколько необходимо. В противном случае пришлось бы копировать и вставлять фрагмент кода каждый раз, когда он понадобится.
Чтобы упростить себе работу, оформите в виде функции часть кода, используемую в сценарии несколько раз. Затем, вместо копирования и вставки этой части, нужно будет только вызывать функцию, как если бы мы обращались к переменной.
Типы функций
Разделяют два типа функций — встроенные и пользовательские.
Встроенные функции — функции, которые за нас уже написали создатели языка программирования, можем просто брать их и использовать. В PHP существуют тысячи готовых функций на все случаи жизни!
Одна из хорошо знакомых функций — функция, которая выводит переданный ей текст на экран — print() .
Пользовательские функции программист создаёт самостоятельно. Эти функции используются только внутри одного проекта или сценария.
Анатомия функций
Работа с функциями состоит из объявления и использования.
Перед тем как использовать новую функцию, следует её объявить:
() < return ; >
Пояснить все составные части функции проще всего на примере.
Допустим, на своём сайте мы хотим показывать, является ли выбранный пользователем год високосным. Для этого напишем функцию, в которую передаётся год. В результате работы функции мы хотим получить значение «истина», если год високосный, и «ложь» — если нет.
Определение такой функции:
elseif ($year % 100 == 0) < if ($year % 400 == 0) < return true; >else < return false; >> else < return true; >>
Пример использования функции:
else
Потренироваться использовать функции в PHP можно в этом тренажёре.
Аргументы функции и область видимости
Наша функция умеет вычислять, является ли переданный год високосным.
Так как функция — это программа в программе, то внутри неё не будут доступны переменные, которые определялись за её пределами. Чтобы передать внутрь функции информацию извне, нужно использовать аргументы функции.
Аргументы функции — это переменные, которые функция может получить из внешнего кода. В примере с is_leap_year такая переменная была только одна — $year .
Верно и обратное — переменные, определённые внутри функции, не будут доступны извне. Такие переменные называются локальными, потому что они локальны по отношению к функции.
В отличие от аргументов, которых может быть несколько, вернуть во внешний код функция может только одно значение — с помощью инструкции return (возврат). Возвращаемое значение называют результатом работы функции.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Источник: htmlacademy.ru
Функция в программе это
Например, функция, которая вызывает предупреждение:
Как вызвать функцию
Функцию вызывают по имени. Например, чтобы вызывать функцию из нашего примера, нужно после функции написать showAlert();
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека фронтендера»
Параметры и аргументы
Аргументы
Функции можно задать сколько угодно параметров, а потом передать им любые значения. Функция сама поймет, что необходимо сделать с этими значениями.
Локальные переменные
Локальные переменные видны только внутри тела функции. За пределами функции эти переменные уже не работают.
Пример кода с локальной переменной
function showMessage() < let message = «Я локальная переменная»; // локальная переменная alert( message ); >showMessage(); // Я локальная переменная alert( message ); //
В примере мы попытались вывести значение переменной message двумя способами: внутри функции путем вызова самой функции и путем вызова самой переменной.
В первом случае — получаем результат работы функции.
Во втором случае — получаем ошибку, потому что переменную видно только внутри функции.
Внешние переменные
Давайте возьмем пример выше. Оставим внутри функции значение переменной message . А за пределами функции заведем другую переменную и назовем ее message .
Пример кода с локальной и внешней переменной
function showMessage() < let message = «Я локальная переменная»; // локальная переменная alert( message ); >let message = «Я внешняя переменная» showMessage(); // Я локальная переменная alert( message ); //Я внешняя переменная
В коде у нас две переменные с одинаковым именем. Но наш сценарий будет считать их разными переменными.
В первом случае переменная будет видна программе только внутри функции showMessage() , во втором случае переменная будет видна всей программе.
Параметры по умолчанию
Когда мы указали параметр и не присвоили ему аргумент, то его значение будет undefined .
Пример кода с параметром по умолчанию
function showMessage(from, text) < // параметра: from, text alert(from + ‘, ‘ + text); >showMessage(‘Привет’, ); // Привет, undefined
В примере параметру text мы не передали значение аргумента. Поэтому в результате мы видим аргумент параметра from и undefined .
Возврат значения
Вернуть значение функции можно с помощью директивы return в теле функции. Например, напишем функцию, которая складывает два параметра.
Пример возврата значения функции с помощью директивы return
function sum(a, b) < return a + b; >let result = sum(1, 2); alert( result ); // 3
В примере мы говорим функции, что необходимо возвращать сумму значений аргументов с помощью директивы return .
Необходимо помнить, что после return выполнение операций в функции прекращается. Поэтому, с помощью return можно прерывать функции.
Функция, которая возвращает функцию
Функцию из предыдущего примера можно записать так:
Пример функции, которая возвращает функцию
const generateSumFinder = () => < const sum = (a, b) =>a + b; return sum; >; const sum = generateSumFinder(); sum(1, 5);
- Создали переменную generateSumFinder и присвоили ей значение стрелочной функции. Когда мы видим значок => , перед нами стрелочная функция.
- Внутри функции создали переменную sum . Это локальная переменная и видна только внутри функции и присвоили ей значение стрелочной функции, которая складывает аргументы a и b.
- Вернули переменную sum .
- За пределами функции создали переменную sum . Это внешняя переменная и она не зависит от переменной внутри функции. Этой переменной мы присвоили значение функции generateSumFinder .
Рекурсия
В рекурсии функция вызывает саму себя. Рекурсия достигается за счет конструкции if…else . Чтобы применить рекурсию нужно определить базовый и рекурсивный случай. Функция будет вызывать саму себя, пока результат не приведет к базовому случаю. В других случаях будет выполняться рекурсивный случай.
function countdown (i) < if (i <=1)< return i; >else < return i-1 >; >; alert (countdown(1));
Функция будет вызываться каждый раз, пока значение ее параметра i больше 1 – это рекурсивный случай. Или вызывается при базовом случае при i
Перегрузка функций в JavaScript
У перегруженных функций одинаковые имена, но разные параметры. JavaScript не поддерживает перегрузку.
Пример функции без перегрузки
function overload(a) < console.log(«Параметр») >function overload(a,b) < console.log(«Два параметра») >overload(1); // Два параметра overload(1,2); // Два параметра
Несмотря на то, что в первой функции один параметр, вывод аргументов этой функции выведет два параметра. Как вы помните, второй ее параметр будет undefined .
В JavaScript есть способы, как перегрузить функцию. Для этого используют метод arguments.length .
Пример функции с перегрузкой
function overload () < if (arguments.length === 1) < console.log(«Параметр») >if (arguments.length === 2) < console.log(«Два параметра») >> overload(1); // Один параметр overload(1, 2); // Два параметра
В примере с помощью метода arguments.length мы узнаем количество параметров в функции и выводим столько параметров, сколько аргументов мы задаем.
Выбор имени функции
Чтобы выбрать имя функции, необходимо следовать правилам:
Использовать слова на английском языке
неправильно | правильно |
pokazatSoobsheniye | showMessage |
Использовать глаголы, потому что функция – это действие
неправильно | правильно |
Message (сообщение) | showMessage (показать сообщение) |
Комментарии в функции
Комментарии нужны, чтобы кто-то кроме вас понимал, что происходит в функции.
Пример комментария в функции
function getDomNodesBySelector(selector) < return Array.from(document.querySelectorAll(selector)); >;// функция возвращает массив, который она возьмет из списка DOM узлов по указанному селектору.
Замыкания
Замыкание – это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В JavaScript все функции являются замыканиями.
Замыкания позволяют функции работать с внешними переменными, даже если они изменились.
Пример замыкания функции на внешней переменной
let name = «Nikolay»; function sayHi() < alert(«Hi, » + name); >name = «Irina»; sayHi();//Hi, Irina
В примере функция sayHi() будет оперировать со вторым значением переменной name . Таким образом, функция замыкает свое действие на известной переменной, где бы не задали ее значение.
Приведем еще один пример:
Пример замыкания функции на внутренней переменной
function makeWorker() < let name = «Nikolay»; return function() < alert(name); >; > let name = «Irina»; // create a function let work = makeWorker(); // call it work(); //Nikolay
В примере функция makeWorker() замыкается на внутренней переменной name = «Nikolay» . Поэтому при инициализации переменных, следует обращать внимание, какая функция будет ими пользоваться и на какой из них будет замыкаться.
Стрелочные функции
Функцию можно задать не только с помощью слова function . Есть способ короче, для этого используют значок => .
Пример функции, которая складывает параметры a и b
let sum = (a, b) => a + b;
Если параметр в функции один, то скобки можно не писать.
Пример записи стрелочной функции с одним параметром n
let double = n => n * 2; alert(double(3))//6
Если параметров нет, то пишут круглые скобки.
Пример стрелочной функции без параметров
let sayHi = () => alert(«Hello!»); sayHi();//Hello!
Лексика this
В стрелочных функциях нет лексики this. Если происходит обращение к this , его значение берется снаружи.
Пример использования this в стрелочной функции
let object = < title: «our object», students: [«Nikolay», «Irina», «Roma»], showList() < this.students.forEach( student =>alert(this.title + ‘: ‘ + student) ); > >; object.showList();
Функции используются, чтобы они выполняли любые действия. Функции позволяют разбить код на блоки, исходя из логики программы. Чтобы овладеть написанием функций, необходимо понимать принципы их работы:
- видимость переменных;
- параметры и аргументы;
- стрелочные функции;
- лексика this;
- замыкания;
- рекурсия;
- колбэки.
Материалы по теме
- ☕ 40 основных и нестандартных методов для работы со строками в JavaScript
- ☕ 5+5=? Преобразование значений в строку или число в JavaScript
- ☕ Методы массивов в JavaScript для новичков: советы, рекомендации и примеры
Источник: proglib.io