Я пытаюсь получить название в настоящее время рабочей функции. Из того, что я читал, это должно быть возможным использованием:
(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();
Типичные хаки arguments.callee здесь не работают, потому что тому, что вы сделали, назначается анонимная функция в качестве значения для ключа testfunc объекта. В этом случае взлом становится еще хуже, но это можно сделать следующим образом:
var testobj = {
testfunc: function(){
for (var attr in testobj) {
if (testobj[attr] == arguments.callee.toString()) {
alert(attr);
break;
}
}
}
}
testobj.testfunc();
/function\s+(\[^\s\(]+)/
Что с обратной косой чертой перед [
? Я не думаю, что вам здесь нужна буквальная квадратная скобка. Без этого он должен работать.
Хотя я настоятельно рекомендую не делать ничего, связанного с сниффингом имени функции или особенно с функцией сниффинга вызывающей стороны. Практически все, что вы можете сделать с помощью этих отвратительных уловок, будет лучше делать с помощью некоторой комбинации замыканий и поисков.
Прежде всего, у функции нет имени. Имя функции - это то, что вы помещаете между функцией
и списком аргументов (...)
. Вот как получить имя функции (не используйте свойство name
, так как оно может быть изменено):
var fName = arguments.callee.toString(0).match(
/^function\s*(?:\s+([\w\$]*))?\s*\(/
);
fName = (fName ? fName[1] : "");
Вы объявили анонимную функцию с помощью
function(){
Вы должны объявить ее как
function testfunc(){
, чтобы было напечатано имя.
.Я обнаружил, что если вы просто регистрируете объект функции, например:
console.log(arguments.callee)
или
console.debug(arguments.callee)
что вы просто получаете имя функции в журнале консоли с некоторыми параметрами.