--- title: Function.caller slug: Web/JavaScript/Reference/Global_Objects/Function/caller tags: - Deprecated - Function - JavaScript - Property translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller ---
function.caller プロパティは、指定した関数の呼び出し元の関数を返します。厳格モード、非同期関数、ジェネレーター関数の呼び出し元については null を返します。
関数 f が最上位のコードで呼び出された場合、 f.caller の値は {{jsxref("null")}} に、それ以外の場合の値は f を呼び出した関数になります。厳格モード、非同期関数、ジェネレーター関数の呼び出し元についても null を返します。
このプロパティは、廃止された {{jsxref("Functions/arguments", "arguments")}} オブジェクトの {{jsxref("Functions/arguments/caller", "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 プロパティの値を確認します。
function myFunc() {
if (myFunc.caller == null) {
return 'The function was called from the top!';
} else {
return 'This function\'s caller was ' + myFunc.caller;
}
}
いずれの標準仕様でも定義されていません。
{{Compat("javascript.builtins.Function.caller")}}