関数と一級オブジェクト


一級オブジェクト


次の条件を満たすオブジェクトを1レベルオブジェクトと呼びます.
  • 無名の文字を生成できます.つまり、実行時に作成できます.
  • 変数または資料構造(配列、オブジェクトなど)に格納できます.
  • 🍔 関数のパラメータに渡すことができます.
  • 🥧 関数の戻り値として使用できます.
  • JavaScript関数は、次のすべての条件を満たす1レベルのオブジェクトです.
    関数は1レベルのオブジェクトです.これは、オブジェクトと同じ関数を使用できることを意味します.オブジェクトは値であるため、値と同じ関数と見なすことができます.🔑 したがって、関数が任意の場所(変数割当て文、オブジェクトのプロパティ値、配列内の要素、関数呼び出しの引数、関数戻り文)で値を使用できる場合、実行時に関数オブジェクトとして定義されます.
    一級オブジェクトとして、関数の最大の特徴は、関数のパラメータに直接伝達され、関数の戻り値として機能することです.これは関数式プログラミングを可能にするJavaScriptの利点の一つである.
    関数はオブジェクトですが、通常のオブジェクトとは異なります.通常のオブジェクトは呼び出せませんが、関数オブジェクトを呼び出すことができます.また、関数オブジェクトには、通常のオブジェクトにない一意の関数構成があります.

    関数オブジェクトの構成


    関数はオブジェクトです.したがって、関数はPropertyを持つこともできます.
    function sayHello(name) {
    	return `Hi ${name}`;
    }
    
    console.dir(sayHello);

    このように、パラメータ、呼び出し者、length、name、prototypeは、関数オブジェクトのデータpropertyです.これらの構成は、通常のオブジェクトではない関数オブジェクトの唯一の構成です.ただし、__proto__は、関数オブジェクト自体のPropertyではなく、アクセス者Propertyです.プロトタイプオブジェクトのプロパティを継承します.__proto__ビジタープロパティは、すべてのオブジェクトで使用できます.

    広告


    関数オブジェクトのarugmesプロパティ値はargumentsオブジェクトです.
    🔑 arumgmentsオブジェクトは、関数呼び出し時に渡されるパラメータの情報を含む配列のような循環可能なオブジェクトです.Argumentsオブジェクトは、関数で領域変数として使用されます.つまり,関数外部から参照することはできない.
    一部のブラウザでは現在、関数オブジェクトのargments構成がサポートされていますが、ES 3からは標準から廃止されています.だから、Function.パラメータの使用は推奨されません.🐼 関数内部では、領域変数のように使用できるarugmesオブジェクトを参照します.
    JavaScript関数では、パラメータの数と引数の数が一致しているかどうかはチェックされません.したがって、関数を呼び出すときにパラメータの数に従ってパラメータを渡さなければ、エラーは発生しません.
    関数を定義する場合、パラメータの関数内での処理方法は領域変数と同じです.すなわち、関数が呼び出されると、パラメータは関数内で暗黙的に宣言され、パラメータが未定義に初期化された後にパラメータが割り当てられる.
    伝達されたパラメータが宣言されたパラメータ数より少ない場合、伝達されていないパラメータは未定義の初期化状態を維持します.渡されたパラメータがパラメータの数より多い場合は、超えたパラメータは無視されます.
    しかし、これは超えた買収が捨てられるという意味ではありません.🧽 すべてのパラメータは、パラメータオブジェクトのデフォルト値として保存されます.
    🔑 Argumentsオブジェクトは、引数を構成値とし、構成キーは引数の順序を表します.argmentsオブジェクトのcallee propertyが呼び出され、argmentsオブジェクトを作成する関数、すなわち関数自体を指し、argmentsオブジェクトのlength propertyは引数の個数を指す.
    javascriptの特性は、宣言パラメータの個数および関数を呼び出すときに渡されるパラメータの個数を決定しないため、関数を呼び出すときにパラメータの個数をチェックし、それに応じて関数の動作を定義する必要がある場合があります.この場合に役立つのはarugmesオブジェクトです.
    パラメータの個数を決定できない可変パラメータ関数を実装する場合は、パラメータオブジェクトが便利です.

    呼び出しプログラム


    呼び出し元プロファイルは、ECMAScript仕様に含まれない非標準プロファイルです.
    🔑 関数オブジェクトの呼び出し元Propertyは、呼び出し関数自体の関数を指します.
    つまり、それは自分の親関数を指します.グローバル関数の場合、グローバル関数オブジェクトの呼び出し元プロパティの値はnullです.

    長さパーセント


    🔑 関数オブジェクトのlength property値は、パラメータの個数を表します.
    なお、argumentsオブジェクトのlength property値はパラメータの個数を表し、関数オブジェクトのlength property値はパラメータの個数を表す.

    名義財産


    🔑 関数オブジェクトのnameプロパティ値は、関数名を表します.
    name PropertyはES 6以前は非標準であり、ES 6では正式標準である.
    🚀 なお、名前構成はES 5とES 6で異なる.匿名関数式の場合、ES 5のnameプロパティ値には空の文字列が使用されます.
    ES 6において、name Property値は、関数オブジェクトを指す識別子を値とする.

    protoビジターProperty


    すべてのオブジェクトにプロトタイプ内部スロットがあります.🛎 Prototypeの内部スロットは、オブジェクト向けのプログラミング継承を実現するプロトタイプオブジェクトを指します.
    🔑 __proto__プロトコルは、プロトタイプ内部スロットが指すプロトタイプオブジェクトにアクセスするために使用されるアクセス者プロトコルです.内部スロットに直接アクセスする方法は存在せず、間接的な方法が提供されている場合にのみアクセスできます.[PRODotype]も内部スロットに直接アクセスすることはできません.__proto__のアクセス者Propertyからプロトタイプオブジェクトに間接的にアクセスできます.

    プロトタイプスキーム


    🏎 prototype propertyは、コンストラクション関数によって呼び出すことができる関数オブジェクト、すなわちコンストラクション関数のみが持つpropertyです.通常のオブジェクトとコンストラクション関数で呼び出せないnon-constructorにはprototype propertyはありません.
    🔑 prototype propertyとは、関数がオブジェクト(インスタンス)を作成するコンストラクション関数として呼び出されると、コンストラクション関数が作成するインスタンスのタイプ化オブジェクトを指します.