JavaScript - arguments.callee.toString () и arguments.callee.name не возвращает имя функции

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

(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
задан Geuis 20 December 2009 в 11:03
поделиться

5 ответов

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

var testobj = {
    testfunc: function(){
      for (var attr in testobj) {
              if (testobj[attr] == arguments.callee.toString()) {
                  alert(attr);
                  break;
                }
            }
    }
}
testobj.testfunc();
8
ответ дан 5 December 2019 в 06:09
поделиться
/function\s+(\[^\s\(]+)/

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

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

2
ответ дан 5 December 2019 в 06:09
поделиться

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

var fName = arguments.callee.toString(0).match(
  /^function\s*(?:\s+([\w\$]*))?\s*\(/
);
fName = (fName ? fName[1] : "");
0
ответ дан 5 December 2019 в 06:09
поделиться

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

function(){

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

function testfunc(){

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

.
10
ответ дан 5 December 2019 в 06:09
поделиться

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

console.log(arguments.callee)

или

console.debug(arguments.callee)

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

0
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: