関数

関数は、モジュール式の再利用可能なステートメント ブロックで、 引数に基づく値の計算や返しなど、関連するタスクに関連するタスク 渡されます。すべての非プリミティブ値と同様に、 オブジェクトです。呼び出せるという点で、一意のオブジェクトです。 コードを実行する(引数の形式でデータを渡す) 値を返す

関数は「ファースト クラス」とみなされる つまり、その固有の動作にもかかわらず、すべての環境で使用できます。 他の JavaScript オブジェクトと同じコンテキストを使用します。たとえば、関数は 他の関数に引数として渡されて返される 使用できます。

function myFunction() {
   console
.log( "This is my function." );
};

オブジェクトのプロパティとして定義される関数は、 通常は「メソッド」と呼ばれます。var を使用して宣言された変数と同様に、 包含する関数の外側で作成された関数宣言は、 メソッドとしてグローバル オブジェクト

関数宣言

関数宣言(「関数ステートメント」または「関数定義」とも呼ばれます) は、含まれるスコープの他の場所で呼び出すことができる名前付き関数を作成します。 関数宣言は、function キーワードの後に ID、かっこで囲まれたカンマ区切りのパラメータのリスト、 ブロック ステートメントです。 “関数本体”です関数宣言の中には、含まれていないものが 末尾がセミコロンである関数宣言はステートメントであり、 セミコロンは ASI によって推測されます。

function myFunction() {
   console
.log( "This is my function." );
};

myFunction
();
> "This is my function."

JavaScript の初期設計上の決定事項である関数宣言 同じレガシー ホイスティングの対象になります。 var で宣言された変数と同じように動作します。つまり、関数宣言は スコープの一番上にホイスティングされ、 そのスコープが strict モードで管理されているかどうかにかかわらず、以下のようになります。

"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."

関数定義のパラメータは、変数のプレースホルダ変数として 関数の呼び出し時に関数本体に渡すことができる値。 関数を呼び出すときのかっこ内の値は「引数」である(ただし、 「arguments」という名前の引数とパラメータの両方を記述するために使用される ドキュメントをご覧ください)。

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 ではほとんど使用されていません。 必要があります。一般的には、より新しく読みやすい rest パラメータの構文 これは、任意の引数を含む配列として初期化される名前付きパラメータを作成します。 次のことができます。

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`
``