非標準
この機能は標準ではなく、標準化の予定もありません。公開されているウェブサイトには使用しないでください。ユーザーによっては使用できないことがあります。実装ごとに大きな差があることもあり、将来は振る舞いが変わるかもしれません。
function.caller
プロパティは、指定した関数の呼び出し元の関数を返します。このプロパティは再帰最適化のため、strict モードでは使用できません。
解説
関数 f
が最上位のコードで呼び出された場合、f.caller
の値は null
に、それ以外の場合の値は f
を呼び出した関数になります。
このプロパティは、廃止された arguments
オブジェクトの 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 で実装されました。
ブラウザー互換性
このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、https://github.com/mdn/browser-compat-data をチェックアウトしてプルリクエストを送信してください。
Update compatibility data on GitHub
デスクトップ | モバイル | サーバー | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
caller | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 8 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
関連情報
- SpiderMonkey の実装に関するバグ 65683