From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../global_objects/function/caller/index.html | 131 +++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 files/ru/web/javascript/reference/global_objects/function/caller/index.html (limited to 'files/ru/web/javascript/reference/global_objects/function/caller') diff --git a/files/ru/web/javascript/reference/global_objects/function/caller/index.html b/files/ru/web/javascript/reference/global_objects/function/caller/index.html new file mode 100644 index 0000000000..4055eaf092 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/caller/index.html @@ -0,0 +1,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 +--- +
{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
+ +

Сводка

+ +

Свойство function.caller возвращает функцию, которая вызвала указанную функцию.

+ +

Описание

+ +

Если функция f была вызвана из кода самого верхнего уровня, значение f.caller будет равно {{jsxref("Global_Objects/null", "null")}}, в противном случае значение будет равно функции, вызвавшей f.

+ +

Это свойство пришло на замену удалённого свойства {{jsxref("Functions_and_function_scope/arguments/caller", "arguments.caller")}} объекта {{jsxref("Functions_and_function_scope/arguments", "arguments")}}.

+ +

Специальное свойство __caller__, возвращающее объект активации вызывающей функции и, таким образом, позволяющее восстанавливать стек вызовов, было удалено по соображениям безопасности.

+ +

Примечания

+ +

Обратите внимание, что в случае рекурсии, вы не сможете воссоздать стек вызовов, используя это свойство. Пусть у нас есть функции:

+ +
function f(n) { g(n - 1); }
+function g(n) { if (n > 0) { f(n); } else { stop(); } }
+f(2);
+
+ +

В момент вызова функции stop(), стек вызовов имеет следующий вид:

+ +
f(2) -> g(2) -> f(2) -> g(1) -> f(1) -> g(0) -> stop()
+
+ +

Следующее условие верно:

+ +
stop.caller === g && f.caller === g && g.caller === f
+
+ +

так что если вы попытаетесь оттрассировать стек в функции stop() подобным образом:

+ +
var f = stop;
+var stack = 'Трассировка стека:';
+while (f) {
+  stack += '\n' + f.name;
+  f = f.caller;
+}
+
+ +

то этот цикл никогда не остановится.

+ +

Примеры

+ +

Пример: проверка значения свойства caller функции

+ +

Следующий код проверяет значение свойства caller функции.

+ +
function myFunc() {
+  if (myFunc.caller == null) {
+    return 'Эта функция была вызвана из верхнего уровня!';
+  } else {
+    return 'Эта функция была вызвана из ' + myFunc.caller;
+  }
+}
+
+ +

Спецификации

+ +

Не является частью какой-либо спецификации. Реализована в JavaScript 1.5.

+ +

Совместимость с браузерами

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatGeckoDesktop("1.0")}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatGeckoMobile("1.0")}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +

Смотрите также

+ + -- cgit v1.2.3-54-g00ecf