私は最近 JavaScript を学び、呼び出し元と呼び出し先で問題が発生したため、オンラインの Baidu によくアクセスしました。見つかった内容は誰にとっても非常に有益なので、共有するためにまとめました。
caller: 関数 function を呼び出す関数への参照を返します (使用法: function.caller)
注: 関数の場合、caller 属性は関数の実行時にのみ定義されます。関数がトップレベルから呼び出された場合、caller は null になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
分析の例: handleCaller が初めて実行されると、両方のアラートが null を返します。値がnullです。次に、caller() 関数が呼び出されます。caller.caller は、それを呼び出した関数 (handleCaller) への参照を返します。handleCaller 関数は、caller.caller() を通じて再度呼び出すことができます。 handleCaller が 2 回目に実行されると、alert(handleCaller.caller) は呼び出し元コード (実際には呼び出し元への参照) を返し、alert(caller.caller) は handleCaller コードを返します。関数間の呼び出し関係は、handleCaller->caller->handleCaller であるためです。その後、2 つの機能が交互に繰り返されます。
caller は現在の関数を呼び出す関数を指しますが、グローバル スコープ (つまりトップレベル ウィンドウ) で呼び出された場合は null が返されることが 1 つあります。
コードの開始
1 2 3 4 5 6 7 8 |
|
世界中に電話をかける
1 |
|
呼び出し
1 2 3 4 |
|
この時点で、testCaller.caller は関数 a を指します
callee: 対応する引数の関数参照を返します。 (主に匿名関数の再帰に使用されます)
注: おそらくインターネット上で最もよく目にするのは、呼び出し先が実行中の関数への参照を返すというものです。これが私が理解している方法です。各関数には独自の引数があり、通常はパラメーターを格納するために使用されます。引数にはcallee属性があり、初期値は自身に対応する関数参照になります。関数がこのステートメントを実行するとき、引数はデフォルトで現在実行中の関数に対応し、arguments.callee は現在実行中の関数への参照になります。もちろん、他の関数の引数 (この例では args) をマークした場合は、当然のことながら args.callee() を使用してその関数を再度呼び出すことができます。
1 2 3 4 5 6 7 8 9 10 |
|
分析例: この例の argument.callee は、デフォルトで現在実行中の関数への参照を返します (a は a 自身の関数参照を返し、c は c 自身の関数参照を返します)。また、 args を使用して関数の引数を格納することにより、組み込み関数 c で args.callee() を使用して、関数 a を再度呼び出します。
1 2 3 4 5 6 7 8 9 |
|
これは、正常な結果をもたらす最小限の再帰です。
以下の呼び出しメソッドを見てください
1 2 3 |
|
理由も簡単で、b=a, b=function a(){}; b を呼び出す前に、a=null を使用しました。したがって、関数 a が実行されているとき、a は関数 a ではなく null を返します。
そこで、エラーを報告し、この問題を解決する方法を教えてください。 a を別の方法に変更しましょう
1 2 3 4 5 6 |
|
もう一度電話してください
1 2 3 |
|
理由: a=null を設定しましたが、a は関数 a では使用されず、arguments.callee を通じて現在の関数を指します。
これは、arguments.callee の定義が次のとおりであるためです。実行中の関数を返します。