非標準
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 )