Имя функции печати закрытый метод IIFE

Этот код Meteor sever имеет printFuncNameчастный метод для IIFE. Когда он вызывается из открытого метода, он дает funcObj = ( function () { const printFuncName = ( str ) => { const info = str ? '' + Str + '' : '' ; console . Log ( arguments . вызываемая . вызывающий . имя + информация ); // <---- строка ошибки }; return { myPub : () => { printFunctionName ( 'info' ); } } } ()); :

TypeError: Невозможно прочитать свойство 'name' из null

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

printFuncName

javascript,meteor,

0

Ответов: 2


0 принят

Предполагая, что вы хотите получить доступ к аргументам arguments, проблема заключается в том, что она является функцией стрелки и поэтому не имеет arguments.calleeпривязки. Вы обращаетесь к IIFE.(function() { const printFuncName = (str) => { const info = str ? ' ' + str + ' ' : ' '; console.log(printFuncName.caller.name + info); // "myPub info " (maybe) }; return { myPub() { printFuncName('info'); } } }()).myPub();

В любом случае, вы никогда не должны использовать caller. Это не стандарт, и вы можете просто ссылаться на эту функцию:

arguments.callee

Помните, что callerэто также не стандарт. Вы не должны использовать это. Не полагайтесь на это. Он будет бросать в строгом режиме. Может не работать в неаккуратном режиме.


2

Предупреждение: что следует за взломом. Кошерный способ сделать это - передать имя в качестве вознаграждения функции. Это лучше, чем Errorподход, однако, используйте его, если нужно.

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

new Error().stack.split('
')
[ 'Error',
  '    at repl:1:1',
  '    at sigintHandlersWrap (vm.js:22:35)',
  '    at sigintHandlersWrap (vm.js:96:12)',
  '    at ContextifyScript.Script.runInThisContext (vm.js:21:12)',
...]

Имя вашего вызывающего абонента будет в этом списке вместе с информацией о файле и строке / столбце. Обратите внимание, что многие функции JS не называются , поэтому это ограничение.

JavaScript, метеор,