Функция — это модульный блок операторов многократного использования, используемый для выполнения набора связанных задач, таких как вычисление и возврат значения на основе аргументов, предоставленных функции. Как и все не примитивные значения , функции являются объектами. Они являются уникальными объектами в том смысле, что их можно вызывать для выполнения кода, передачи данных в форме аргументов и возврата значения.
Функции считаются объектами « первого класса », а это означает, что, несмотря на их уникальное поведение, их можно использовать во всех тех же контекстах, что и любой другой объект JavaScript. Например, функция может быть присвоена переменной, передана в качестве аргумента другим функциям и возвращена другими функциями.
function myFunction() {
console.log( "This is my function." );
};
Функция, определенная как свойство объекта , обычно называется «методом». Как и в случае с переменными, объявленными с помощью var
`, объявления функций, сделанные вне включающей функции, добавляются к глобальному объекту как методы.
Объявления функций
Объявление функции (также называемое «оператором функции» или «определением функции») создает именованную функцию, которую можно вызывать в любом месте содержащейся в ней области. Объявления функций состоят из ключевого слова function
, за которым следует идентификатор, списка параметров, разделенных запятыми, заключенных в круглые скобки, и оператора блока , называемого «телом функции». Вы часто будете сталкиваться с объявлениями функций, которые не заканчиваются точкой с запятой; поскольку объявление функции является оператором, ASI может вывести конечные точки с запятой.
function myFunction() {
console.log( "This is my function." );
};
myFunction();
> "This is my function."
В результате ранних проектных решений JavaScript объявления функций подвергаются тому же устаревшему поведению подъема , что и переменные, объявленные с помощью var
, что означает, что объявление функции поднимается в начало своей области видимости и в результате может быть вызвано до объявления. независимо от того, регулируется ли эта область строгим режимом :
"use strict";
{
myFunction();
function myFunction() {
console.log( "This is my function." );
};
}
> "This is my function."
Вне строгого режима объявления функций используют устаревшее поведение области видимости JavaScript, что означает, что область объявления функции ограничивается ближайшей включающей функцией:
function myFunction() {
function myNestedFunction() {
console.log( "This is my nested function." );
}
myNestedFunction();
};
myFunction();
> "This is my nested function."
myNestedFunction();
>Uncaught ReferenceError: myNestedFunction is not defined
В строгом режиме объявления функций ограничиваются ближайшим охватывающим блоком, как и переменные, объявленные с помощью let
или const
:
"use strict";
{
function myFunction() {
console.log( "This is my function." );
};
}
myFunction();
> Uncaught ReferenceError: myFunction is not defined
Вызов функции
Как и в случае с переменными, идентификатор, используемый при объявлении функции, действует как символическое имя значения. Обращение к функции только по идентификатору возвращает только объект функции и не выполняет содержащуюся в нем функцию:
function myFunction() {
console.log( "This is my function." );
};
myFunction;
> myFunction() {
console.log( "This is my function." );
}
Чтобы выполнить код внутри тела функции, вызовите (или вызовите ) функцию, указав после имени функции соответствующую пару круглых скобок:
function myFunction() {
console.log( "My function has been executed." );
}
myFunction();
> "My function has been executed."
Параметры в определении функции действуют как переменные-заполнители для значений, которые могут быть переданы в тело функции при вызове функции. Значения в круглых скобках при вызове функции являются «аргументами» (хотя в некоторой документации вы можете увидеть «аргументы», используемые для описания как аргументов, так и параметров):
function myFunction( myParameter ) {
console.log( `The value is: ${ myParameter }.` );
};
myFunction( "this string" );
> "The value is: this string."
Если ожидаемый аргумент опущен, результирующий параметр будет содержать undefined
значение, поскольку параметр объявлен в теле функции, но не инициализирован значением:
function myFunction( myParameter ) {
console.log( `The value is: ${ myParameter }.` );
};
myFunction();
> "The value is: undefined."
Вы можете установить значения параметров по умолчанию, инициализируя их так же, как инициализируете переменную: оператор присваивания ( =
), за которым следует значение. Если позже вы укажете аргумент для этой функции, это новое значение переопределит значение по умолчанию:
function myFunction( myParameter = "omitted" ) {
console.log( `The value is: ${ myParameter }.` );
};
myFunction( "this string" );
> "The value is: this string."
myFunction();
> "The value is: omitted."
Тело функции без стрелок также имеет доступ к объекту arguments
, подобному массиву , с нулевым индексом, содержащему любые значения, передаваемые в качестве аргументов, независимо от того, указывают ли определение функции параметры:
function myFunction() {
console.log( arguments );
};
myFunction( 3, true, "My string" );
> Arguments { 0: 3, 1: true, 2: "My string", … }
Вариадические функции
Объект arguments
позволяет создавать базовые функции с переменным числом аргументов , которые могут принимать переменное количество аргументов:
function myFunction() {
let result = "";
for (let i = 0; i < arguments.length; i++) {
result += arguments[i] + " - ";
}
console.log( result );
};
myFunction( "My first string", "My second string", "my third string" );\
> "My first string - My second string - my third string - "
Однако этот подход к функциям с переменным числом вариантов редко используется в современной разработке JavaScript. Чаще используется более современный и читаемый синтаксис остальных параметров , который создает именованный параметр, инициализированный как массив, содержащий любые аргументы, помимо явно указанных:
function myFunction( mySeparator, ...myStrings ) {
console.log( myStrings.join( mySeparator ) );
};
myFunction( " - ", "My first string", "My second string", "my third string" );
> "My first string - My second string - my third string"
В отличие от привязки parameter
, синтаксис остальных параметров работает с параметрами стрелочной функции ожидаемым образом:
function myOuterFunction() {
let myInnerArrowFunction = ( ...myParams ) => {
console.log( myParams[ 0 ] );
}
myInnerArrowFunction( true );
};
myOuterFunction( false );
> true
let myArrowFunction = ( ...myParams ) => {
console.log( myParams[ 0 ] );
};
myArrowFunction( true );
> true`
``