Функции представляют собой набор инструкций, которые можно повторно вызывать в различных частях программы по имени функции. В общем случае синтаксис определения функции выглядит следующим образом:
function имя_функции(параметры){
// Инструкции
}
Определение функции начинается с ключевого слова function, после которого следует имя функции. Наименование функции подчиняется тем же правилам, что и наименование переменной: оно может содержать только цифры, буквы, символы подчеркивания и доллара ($) и должно начинаться с буквы, символа подчеркивания или доллара.
После имени функции в скобках идет перечисление параметров. Даже если параметров у функции нет, то просто идут пустые скобки. Затем в фигурных скобках идет тело функции, содержащее набор инструкций.
Определим простейшую функцию:
function hello(){
console.log("Hello Metanit.com");
}
Данная функция называется hello(). Она не принимает никаких параметров и все, что она делает, это выводит на консоль браузера строку "Hello Metanit.com".
Чтобы функция выполнила свою работу, нам надо ее вызвать. Общий синтаксис вызова функции:
имя_функции(параметры)
При вызове после имени вызываемой функции в скобках указывается список параметров. Если функция не имеет параметров, то указывются пустые скобки.
Например, определим и вызовем простейшую функцию:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>METANIT.COM</title>
</head>
<body>
<script>
// определение функции
function hello(){
console.log("Hello Metanit.com");
}
// вызов функции
hello();
</script>
</body>
</html>
В данном случае функция hello не принимает параметров, поэтому при ее вызове указываются пустые скобки:
hello();
Отличительной чертой функций является то, что их можно многократно вызывать в различных местах программы:
// определение функции
function hello(){
console.log("Hello Metanit.com");
}
// вызов функции
hello();
hello();
hello();
Подобно тому, как константам и переменным присваиваются простейшие значения (числа, строки и т.д.), также им можно присваивать функции. Затем через такую переменную или константу можно вызвать присвоенную ей функцию:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>METANIT.COM</title>
</head>
<body>
<script>
// определение функции
function hello(){
console.log("Hello from Metanit.com");
}
// передача константе message ссылки на функцию hello
const message = hello;
message(); // вызываем функцию, ссылка на которую хранится в константе message
</script>
</body>
</html>
Присвоив константе или переменной функцию:
const message = hello;
затем мы можем по имени константы/переменной вызывать эту функцию:
message();
Также мы можем динамически менять функции, которые хранятся в переменной:
function goodMorning(){
console.log("Доброе утро");
}
function goodEvening(){
console.log("Добрый вечер");
}
let message = goodMorning; // присваиваем переменной message функцию goodMorning
message(); // Доброе утро
message = goodEvening; // меняем функцию в переменной message
message(); // Добрый вечер
Необязательно давать функциям определенное имя. Можно использовать анонимные функции. Такие функции при определении присваиваются константе или переменной. Эти функции еще называют функции-выражения (function expression):
const message = function(){
console.log("Hello JavaScript");
}
message();
Используя имя константы или переменной, которой присвоена функция, можно вызывать эту функцию.
JavaScript позволяет определять локальные функции - функции внутри других функций. Локальные функции видно только в рамках внешней функции, в которой они определены. Например:
function print(){
printHello();
printHello();
printHello();
function printHello(){
console.log("Hello");
}
}
print();
printHello(); // Uncaught ReferenceError: printHello is not defined - локальную функцию можно вызвать только из ее окружающей функции
Здесь внутри функции print определена локальная функция printHello, которая просто выводит строку "Hello". И внутри функции print мы можем вызвать локальную функцию printHello, однако вне окружающей функции локальную функцию вызвать нельзя.
Данный пример довольно простой и не имеет большого смысла. Однако, как правило, локальные функции определяются для таких действий, которые применяются многократно только в рамках какой-то одной функции и больше нигде. К минусам локальных функции можно отнести то, что они создаются всякий раз, когда происходит вызов внешней функции.