Функции

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

Функции считаются объектами « первого класса », а это означает, что, несмотря на их уникальное поведение, их можно использовать во всех тех же контекстах, что и любой другой объект 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`
``