Function.caller

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

ドキュメントのタグと貢献者

 このページの貢献者: teoli, ethertank, yyss
 最終更新者: teoli,