/
index.md
88 lines (62 loc) · 2.49 KB
/
index.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
---
title: Function.caller
slug: Web/JavaScript/Reference/Global_Objects/Function/caller
---
{{JSRef}} {{deprecated_header}}
**`function.caller`** プロパティは、指定した関数の呼び出し元の関数を返します。厳格モード、非同期関数、ジェネレーター関数の呼び出し元については `null` を返します。
## 解説
関数 `f` が最上位のコードで呼び出された場合、 `f.caller` の値は [`null`](/ja/docs/Web/JavaScript/Reference/Operators/null) に、それ以外の場合の値は `f` を呼び出した関数になります。厳格モード、非同期関数、ジェネレーター関数の呼び出し元についても `null` を返します。
このプロパティは、廃止された {{jsxref("Functions/arguments", "arguments")}} オブジェクトの {{jsxref("Functions/arguments/caller", "arguments.caller")}} プロパティを置き換えます。
特殊プロパティである `__caller__` は呼び出し元の activation オブジェクトを返し、スタックの再現に利用できましたが、セキュリティ上の理由により削除されました。
### 注
再帰呼び出しの場合、このプロパティを用いてコールスタックを再現することはできません。以下について考えてみましょう。
```js
function f(n) {
g(n - 1);
}
function g(n) {
if (n > 0) {
f(n);
} else {
stop();
}
}
f(2);
```
`stop()` が呼び出された時点のコールスタックは以下のようになるでしょう。
```js
f(2) -> g(1) -> f(1) -> g(0) -> stop()
```
以下は真になります。
```js
stop.caller === g && f.caller === g && g.caller === f;
```
従って、`stop()` 関数のスタックトレースを以下のようにして取得するとします。
```js
var f = stop;
var stack = "Stack trace:";
while (f) {
stack += "\n" + f.name;
f = f.caller;
}
```
これは無限ループになります。
## 例
### 関数の caller プロパティの値を確認する
以下のコードは、関数の `caller` プロパティの値を確認します。
```js
function myFunc() {
if (myFunc.caller == null) {
return "The function was called from the top!";
} else {
return "This function's caller was " + myFunc.caller;
}
}
```
## 仕様書
いずれの標準仕様でも定義されていません。
## ブラウザーの互換性
{{Compat}}
## 関連情報
- {{jsxref("Function.name", "Function.name")}}
- {{jsxref("Functions/arguments", "arguments")}}