非標準
This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
概要
指定した関数の呼び出し元の関数を返します。
このプロパティは、ECMA-262 第 3 版の一部ではありません。これは少なくとも SpiderMonkey (Mozilla が用いている JavaScript エンジン) (バグ 65683 をご覧ください)、V8 (Chrome で用いられる JavaScript エンジン)、および JScript で実装されています。
説明
関数 f
がトップレベルのコードで呼び出された場合 f.caller
の値は null
に、それ以外の場合の値は f
を呼び出した関数になります。
このプロパティは、廃止された arguments.caller を置き換えます。
補足
再帰呼び出しの場合、このプロパティを用いてコールスタックを再現することはできません。以下について考えてみましょう:
function f(n) { g(n-1) } function g(n) { if(n>0) f(n); else stop() } f(2);
stop()
が呼び出された時点のコールスタックは以下のようになるでしょう:
f(2) -> g(1) -> f(1) -> g(0) -> stop()
以下は真になります:
stop.caller === g && f.caller === g && g.caller === f
従って、stop()
関数のスタックトレースを以下のようにして取得するとします:
var f = stop; var stack = "Stack trace:"; while (f) { stack += "\n" + f.name; f = f.caller; }
これは無限ループになります。
特殊プロパティである __caller__
は呼び出し元の activation オブジェクトを返し、スタックの再現に利用できましたが、セキュリティ上の理由により削除されました。
例
例: 関数の caller
プロパティの値を確認する
以下のコードは、関数の caller
プロパティの値を確認します。
function myFunc() { if (myFunc.caller == null) { return ("The function was called from the top!"); } else return ("This function's caller was " + myFunc.caller); }
ブラウザのサポート
Function.caller は現状、すべての主要なブラウザ (Firefox、Safari、Chrome、Opera、および IE) でサポートされています。
(互換性情報: ECMAScript extensions compatibility table )