Функции

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

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