javascript - arguments.callee.toString () и arguments.callee.name не возвращает имя функции - PullRequest
8 голосов
/ 20 декабря 2009

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

(arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/)

Однако, когда я запускаю это в Firefox и Safari (последние версии для Mac), имя не возвращается.

console.log (arguments.callee) возвращает источник функции, но не назначенное имя. arguments.callee.name возвращает пустую строку.

Мой пример кода выглядит следующим образом:

var testobj = {
    testfunc: function(){
        console.log( (arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/) );
    }
}
testobj.testfunc();

Ответы [ 8 ]

10 голосов
/ 20 декабря 2009

Вы объявили анонимную функцию с

function(){

Вы должны объявить это как

function testfunc(){

чтобы напечатать имя.

8 голосов
/ 13 февраля 2010

Типичные хаки arguments.callee здесь не работают, потому что для того, что вы сделали, назначена анонимная функция в качестве значения для ключа 'testfunc' объекта. В этом случае взлом становится еще хуже, но это можно сделать следующим образом:

var testobj = {
    testfunc: function(){
      for (var attr in testobj) {
              if (testobj[attr] == arguments.callee.toString()) {
                  alert(attr);
                  break;
                }
            }
    }
}
testobj.testfunc();
3 голосов
/ 20 октября 2010

В Firefox 3.5, Safari 5 и Chrome 6.0 вы можете использовать:

function myFunctionName() {
 alert("Name is " + arguments.callee.name );
}

myFunctionName();

Вы также можете получить функцию, которая вызвала текущую, используя arguments.callee.caller.

2 голосов
/ 19 февраля 2013
Function.prototype.getName = function(fn) {
    if(Function.name || Function.prototype.name) return this.name;
    return this.toString().match(/^function\s+(\w+)\s*\(/)[1];
};
2 голосов
/ 25 августа 2011

Я думаю, что есть намного более чистое и элегантное решение для всего этого. Предполагая, что функция является членом какого-то высокоуровневого объекта - это всегда так, даже если владельцем функции является «окно» или какой-то другой глобальный объект, мы можем получить доступ к глобальному объекту через this ключевое слово, мы можем получить доступ к самой функции через arguments.callee , и мы можем получить доступ ко всем именам объектов (функций) родителя через для (в этом случае var) , поэтому вам следует быть в состоянии получить желаемую информацию довольно легко, как ...

returnMyName = function() {
  for (var o in this) {
    if (arguments.callee===this[o]) return o;
  }
};

Это должно быть надежно и избегать любых странных действий браузера IE, обращающихся к именованным функциям и т. Д.

2 голосов
/ 20 декабря 2009
/function\s+(\[^\s\(]+)/

Что с обратной косой чертой до [? Я не думаю, что вы хотите буквальную квадратную скобку здесь. Без этого все должно работать.

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

0 голосов
/ 24 февраля 2010

Я обнаружил, что если вы просто регистрируете объект функции, например, так:

console.log(arguments.callee)

или

console.debug(arguments.callee)

что вы просто получаете имя функции в журнале консоли с некоторыми опциями.

0 голосов
/ 20 декабря 2009

Прежде всего, функция не имеет имени. Имя функции - это то, что вы помещаете между function и списком аргументов (...). Вот как получить имя функции (не используйте свойство name, так как оно может быть изменено):

var fName = arguments.callee.toString(0).match(
  /^function\s*(?:\s+([\w\$]*))?\s*\(/
);
fName = (fName ? fName[1] : "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...