非標準
この機能は標準ではなく、標準化の予定もありません。公開されているウェブサイトには使用しないでください。ユーザーによっては使用できないことがあります。実装ごとに大きな差があることもあり、将来は振る舞いが変わるかもしれません。

function.caller プロパティは指定した関数の呼び出し元の関数を返します。このプロパティは再帰最適化のため、strict モードでは使用できません。

説明

関数 f がトップレベルのコードで呼び出された場合 f.caller の値は null に、それ以外の場合の値は f を呼び出した関数になります。

このプロパティは、廃止された arguments.caller を置き換えます。

特殊プロパティである __caller__ は呼び出し元の activation オブジェクトを返し、スタックの再現に利用できましたが、セキュリティ上の理由により削除されました。

補足

再帰呼び出しの場合、このプロパティを用いてコールスタックを再現することはできません。以下について考えてみましょう:

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 プロパティの値を確認する

以下のコードは、関数の caller プロパティの値を確認します。

function myFunc() {
  if (myFunc.caller == null) {
    return 'The function was called from the top!';
  } else {
    return 'This function\'s caller was ' + myFunc.caller;
  }

仕様

あらゆる標準仕様に組み込まれていません。JavaScript 1.5 で実装されました。

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応
非標準
Chrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 8Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。

関連情報

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

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