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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
---
title: Function.caller
slug: Web/JavaScript/Reference/Global_Objects/Function/caller
tags:
- Function
- JavaScript
- Non-standard
- Property
translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller
---
<div>{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}</div>
<h2 id="Summary" name="Summary">Сводка</h2>
<p>Свойство <code><strong><em>function</em>.caller</strong></code> возвращает функцию, которая вызвала указанную функцию.</p>
<h2 id="Description" name="Description">Описание</h2>
<p>Если функция <code>f</code> была вызвана из кода самого верхнего уровня, значение <code>f.caller</code> будет равно {{jsxref("Global_Objects/null", "null")}}, в противном случае значение будет равно функции, вызвавшей <code>f</code>.</p>
<p>Это свойство пришло на замену удалённого свойства {{jsxref("Functions_and_function_scope/arguments/caller", "arguments.caller")}} объекта {{jsxref("Functions_and_function_scope/arguments", "arguments")}}.</p>
<p>Специальное свойство <code>__caller__</code>, возвращающее объект активации вызывающей функции и, таким образом, позволяющее восстанавливать стек вызовов, было удалено по соображениям безопасности.</p>
<h3 id="Notes" name="Notes">Примечания</h3>
<p>Обратите внимание, что в случае рекурсии, вы не сможете воссоздать стек вызовов, используя это свойство. Пусть у нас есть функции:</p>
<pre class="brush: js">function f(n) { g(n - 1); }
function g(n) { if (n > 0) { f(n); } else { stop(); } }
f(2);
</pre>
<p>В момент вызова функции <code>stop()</code>, стек вызовов имеет следующий вид:</p>
<pre class="eval">f(2) -> g(2) -> f(2) -> g(1) -> f(1) -> g(0) -> stop()
</pre>
<p>Следующее условие верно:</p>
<pre class="eval">stop.caller === g && f.caller === g && g.caller === f
</pre>
<p>так что если вы попытаетесь оттрассировать стек в функции <code>stop()</code> подобным образом:</p>
<pre class="brush: js">var f = stop;
var stack = 'Трассировка стека:';
while (f) {
stack += '\n' + f.name;
f = f.caller;
}
</pre>
<p>то этот цикл никогда не остановится.</p>
<h2 id="Examples" name="Examples">Примеры</h2>
<h3 id="Example:_Checking_the_value_of_a_function.27s_caller_property" name="Example:_Checking_the_value_of_a_function.27s_caller_property">Пример: проверка значения свойства <code>caller</code> функции</h3>
<p>Следующий код проверяет значение свойства <code>caller</code> функции.</p>
<pre class="brush: js">function myFunc() {
if (myFunc.caller == null) {
return 'Эта функция была вызвана из верхнего уровня!';
} else {
return 'Эта функция была вызвана из ' + myFunc.caller;
}
}
</pre>
<h2 id="Specifications" name="Specifications">Спецификации</h2>
<p>Не является частью какой-либо спецификации. Реализована в JavaScript 1.5.</p>
<h2 id="Browser_compatibility" name="Browser_compatibility">Совместимость с браузерами</h2>
<div>{{CompatibilityTable}}</div>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Возможность</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Базовая поддержка</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatGeckoDesktop("1.0")}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Возможность</th>
<th>Android</th>
<th>Chrome для Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Базовая поддержка</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatGeckoMobile("1.0")}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<h2 id="See_also" name="See_also">Смотрите также</h2>
<ul>
<li>Ошибка реализации в SpiderMonkey: {{bug(65683)}}</li>
</ul>
|