上記の概念について言及する前に、まず JavaScript の関数の暗黙的なパラメーターである引数について説明したいと思います。
引数
このオブジェクトは、実行される関数とそれを呼び出す関数のパラメーターを表します。
[function.]arguments[n]
パラメータ関数: オプション。現在実行中の Function オブジェクトの名前。 n: オプション。 Function オブジェクトに渡されるパラメーター値の 0 から始まるインデックス。
説明
Arguments は、関数呼び出し時に指定されたパラメータに加えて作成される隠しオブジェクトです。 Arguments は配列に似ていますが、配列ではないオブジェクトです。配列と同じアクセス プロパティとメソッドを持ち、対応する単一パラメーターの値に argument[ を通じてアクセスできるためです。 n] であり、配列長属性 length を持ちます。また、引数オブジェクトには、関数宣言で定義したパラメータリストに限らず、実際に関数に渡されるパラメータが格納されており、明示的に作成することはできません。引数オブジェクトは関数の先頭でのみ使用できます。次の例では、これらのプロパティの詳細を示します。
発信者
現在の関数を呼び出した関数への参照を返します。
functionName.caller
functionName オブジェクトは、実行される関数の名前です。
説明
関数の場合、caller 属性は関数の実行時にのみ定義されます。関数がトップレベルから呼び出される場合、caller には null が含まれます。 caller 属性が文字列コンテキストで使用される場合、結果は functionName.toString と同じになります。つまり、関数の逆コンパイルされたテキストが表示されます。
次の例は、caller 属性の使用法を示しています。
実行中の Function オブジェクト (指定された Function オブジェクトの本体) を返します。
[function.]arguments.callee
オプションの関数パラメーターは、現在実行されている Function オブジェクトの名前です。
説明
callee 属性の初期値は、実行される Function オブジェクトです。
callee 属性は、関数オブジェクト自体への参照を表す引数オブジェクトのメンバーです。これは、匿名関数の再帰や関数のカプセル化を保証するのに役立ちます。たとえば、次の例では、 1からnまでの自然数の和。このプロパティは、関連する関数が実行されている場合にのみ使用できます。また、呼び出し先には長さ属性があり、検証にはこの方が適している場合があることにも注意してください。 argument.length は実際のパラメータの長さ、arguments.callee.length は仮パラメータの長さです。これにより、呼び出し時の仮パラメータの長さが実際のパラメータの長さと一致しているかどうかを判断できます。
例
それらの機能は、実行のために関数を別のオブジェクトにバインドすることです。この 2 つの唯一の違いは、パラメーターを定義する方法です。
apply(thisArg,argArray);call(thisArg[,arg1,arg2…] ]);
つまり、すべての関数内の this ポインターには thisArg が割り当てられ、関数を別のオブジェクトのメソッドとして実行するという目的を実現できます
適用の手順
argArray が有効な配列でない場合、または引数オブジェクトではない場合、TypeError が発生します。 argArray も thisArg も指定されていない場合は、Global オブジェクトが thisArg として使用され、
パラメータを渡すことはできません。
call の説明
call メソッドは、関数のオブジェクト コンテキストを初期コンテキストから thisArg で指定された新しいオブジェクトに変更できます。 thisArg パラメータが指定されていない場合は、Global オブジェクトが thisArg として使用されます
関連ヒント:
call と apply を適用する別のトリックがあります。call と apply を使用して別の関数 (クラス) を適用した後、現在の関数 (クラス) に他の関数 (クラス) のメソッドまたは属性を持たせることもできます。 「継承」といいます。次の例を見てください:
ちなみに、apply は、クラスを定義するパターンを作成するために JavaScript フレームワーク プロトタイプで使用されます。
実装コードは次のとおりです:
例:
var moto=新しい車両("Moto");
moto.showSelf();