Как получить имя функции из этой функции? - PullRequest
229 голосов
/ 15 апреля 2010

Как я могу получить доступ к имени функции внутри этой функции?

// parasitic inheritance
var ns.parent.child = function() {
  var parent = new ns.parent();
  parent.newFunc = function() {

  }
  return parent;
}

var ns.parent = function() {
  // at this point, i want to know who the child is that called the parent
  // ie
}

var obj = new ns.parent.child();

Ответы [ 20 ]

3 голосов
/ 12 августа 2018

Вы можете использовать имя конструктора, например:

{your_function}.prototype.constructor.name

этот код просто возвращает имя метода.

3 голосов
/ 25 февраля 2015

как часть ECMAScript 6 вы можете использовать Function.name method

function doSomething() {}

alert(doSomething.name); // alerts "doSomething"
2 голосов
/ 18 мая 2016

Я знаю, что это старый вопрос, но в последнее время я столкнулся с некоторой подобной проблемой, пытаясь украсить некоторые методы компонента React для целей отладки. Как уже говорилось, arguments.caller и arguments.callee запрещены в строгом режиме, который, вероятно, включен по умолчанию в вашем транспаранте React. Вы можете либо отключить его, либо я смог придумать еще один хак, потому что в React все функции классов названы, вы можете сделать это:

Component.prototype.componentWillMount = function componentWillMount() {
    console.log('Callee name: ', this.__proto__.constructor.toString().substr(0,30));
...
}
1 голос
/ 25 февраля 2019

Если я понял, что вы хотите сделать, это то, что я делаю внутри конструктора функции.

if (!(this instanceof arguments.callee)) {
    throw "ReferenceError: " + arguments.callee.name + " is not defined";
}
1 голос
/ 24 августа 2014

У меня была похожая проблема, и я решил ее следующим образом:

Function.prototype.myname = function() {
   return this.toString()
       .substr( 0, this.toString().indexOf( "(" ) )
       .replace( "function ", "" ); 
}

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

<script language="javascript" TYPE="text/javascript">

    Function.prototype.myname = function() { 
        return this.toString()
            .substr( 0, this.toString().indexOf( "(" ) )
            .replace("function ", "" ); 
    }
    function call_this( _fn ) { document.write( _fn.myname() ); }
    function _yeaaahhh() { /* do something */ }
    call_this( _yeaaahhh ); 

</script>
1 голос
/ 08 октября 2014

Это сработало для меня.

function AbstractDomainClass() {
    this.className = function() {
        if (!this.$className) {
            var className = this.constructor.toString();
            className = className.substr('function '.length);
            className = className.substr(0, className.indexOf('('));
            this.$className = className;
        }
        return this.$className;
    }
}

Тестовый код:

var obj = new AbstractDomainClass();
expect(obj.className()).toBe('AbstractDomainClass');
0 голосов
/ 08 мая 2019

Это будет работать в ES5, ES6, во всех браузерах и функциях строгого режима.

Вот как это выглядит с именованной функцией.

(function myName() {
  console.log(new Error().stack.split(/\r\n|\r|\n/g)[1].trim());
})();
at myName (<anonymous>:2:15)

Вот как это выглядит с анонимной функцией.

(() => {
  console.log(new Error().stack.split(/\r\n|\r|\n/g)[1].trim());
})();
at <anonymous>:2:15
0 голосов
/ 12 сентября 2016

вы можете использовать Error.stack для отслеживания имени функции и точного положения, где вы находитесь в ней.

См. stacktrace.js

0 голосов
/ 01 октября 2015

Простой способ получить имя функции из функционирующей вами функции.

function x(){alert(this.name)};x()
0 голосов
/ 15 апреля 2010

смотрите здесь: http://www.tek -tips.com / viewthread.cfm? Qid = 1209619

arguments.callee.toString();

, кажется, подходит для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...