Подтвердить что ты не робот

"вызывающий" и "аргумент" являются ограниченными функциями функции и в этом контексте недоступны

Я пытаюсь создать простую функцию отладки, которая просто отображает вызывающую функцию, например:

function xe() {
  console.log(xe.caller().name)
}

С этим я бы просто смог добавить xe() к функции, и он будет регистрировать вызовы функции - просто краткое, простое дополнение, которое поможет в отладке. Отладка сахара, так сказать.

К сожалению, я получаю сообщение об ошибке:

TypeError: "вызывающий" и "аргумент" являются ограниченными функциями функции и не могут быть доступны в этом контексте.

Я использую Babel/ES6, который вводит "use strict" в начало каждого модуля. Это может быть причиной, но поиск дал ограниченную информацию о том, почему возникает ошибка, и я хотел бы лучше понять ее.

Если строгий режим - проблема, я бы предпочел не отключать строгий режим для всего проекта - только для модуля/функции.

4b9b3361

Ответ 1

Это причина. Из MDN:

в строгом режиме больше не возможно "ходить" по стеклу JavaScript через общепринятые расширения в ECMAScript. В нормальном коде с этими расширениями, когда функция fun находится посреди вызываемого вызова, fun.caller - это функция, которая в последнее время называется fun, а fun.arguments - это аргументы для этого вызова забавы. Оба расширения являются проблематичными для "безопасного" JavaScript, поскольку они позволяют "защищенному" коду получить доступ к "привилегированным" функциям и их (потенциально необеспеченным) аргументам. Если забава находится в строгом режиме, как fun.caller, так и fun.arguments - не подлежащие удалению свойства, которые бросаются при установке или извлечении:

Если вы делаете ES6, вы не можете в общем случае отключить строгий режим. Он подразумевается во время определенных условий, например, в модуле ES6.

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

Если вы просто выводите информацию об отладке, вы также можете просто прочитать стек объекта Error:

console.log(new Error().stack);

Вы можете globaly disable (но я понимаю, что это не то, что вы хотите) use strict с babel. Используя либо:

require("6to5").transform("code", { blacklist: ["useStrict"] });

или

$ 6to5 --blacklist useStrict

Если вы должны отключить его на уровне модуля, я подозреваю, что вам придется делать это самостоятельно. Базовая строка заменяет, возможно,?

Кроме того, как было указано в ES5. Он должен быть xe.caller.name, а не xe.caller().name или вы повторно вызываете функцию.

Ответ 2

По этой документации. Свойство Function.caller() возвращает функцию, вызывающую указанную функцию. Просто вы получите полную функцию звонящего, когда используете xe.caller. Опять вы выполняете функцию звонящего. Здесь вы выполняете рекурсию, и именно по этой причине она не позволяет в строгом режиме.

Вы можете выполнить свою функцию образца в консоли браузера. вы получите ошибку Maximum call stack size exceeded.