Подтвердить что ты не робот

Получить имя функции в JavaScript

Кто-нибудь знает, есть ли способ получить имя функции JavaScript. Например, я получил функцию типа

function test1(){
alert(1);
}

У меня это в моей голове. Затем я создаю объект obj1 и помещаю туда свою функцию

obj1.func = test1;

Когда я вызываю метод в объекте obj1, могу ли я каким-либо образом получить имя моей функции (test1) внутри этого метода, кроме синтаксического разбора источника (this.func.toString()) функции.

4b9b3361

Ответ 1

function test() {  alert(arguments.callee.name); } 
b = test; 
b();

выводит "тест" (в Chrome, Firefox и, вероятно, Safari). Однако arguments.callee.name доступен только из внутри.

Если вы хотите получить имя от вне, вы можете проанализировать его из:

b.toString();

но я думаю, что свойство имени объекта функции может быть тем, что вам нужно:

alert(b.name);

это, однако, не работает для IE и Opera, поэтому вам остается разбираться в них вручную в этих браузерах.

Ответ 2

До ES2015 не было стандартного способа получить имя функции. Большинство современных браузеров поддерживают свойство name на объектах Function, которые были нестандартными до ES2015, но текущая версия IE не работает. Единственный вариант, который вам остается оставить, если вам нужно поддерживать IE, пытается проанализировать имя из представления строки функции, которое не является хорошей идеей. Здесь (длинная) дискуссия об этом: http://groups.google.com/group/comp.lang.javascript/browse_frm/thread/b85dfb2f2006c9f0

Ответ 3

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

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

var nameFromToStringRegex = /^function\s?([^\s(]*)/;

/**
 * Gets the classname of an object or function if it can.  Otherwise returns the provided default.
 *
 * Getting the name of a function is not a standard feature, so while this will work in many
 * cases, it should not be relied upon except for informational messages (e.g. logging and Error
 * messages).
 *
 * @private
 */
function className(object, defaultName) {
    var result = "";
    if (typeof object === 'function') {
        result = object.name || object.toString().match(nameFromToStringRegex)[1];
    } else if (typeof object.constructor === 'function') {
        result = className(object.constructor, defaultName);
    }
    return result || defaultName;
}

Ответ 4

Лучше всего сделать следующее:

function functionName(fun) {
  var ret = fun.toString();
  ret = ret.substr('function '.length);
  ret = ret.substr(0, ret.indexOf('('));
  return ret;
}

Примечание. Использование Function.caller является нестандартным, а arguments.callee запрещено в строгом режиме.

Ответ 5

Один интересный способ, которым я экспериментирую, - это объявление следующего вида:

var test1 = function test1(){
    alert(1);
};

Это немного взломано, но в итоге происходит test1 - локальная переменная, содержащая объект [Function: test1].

Вот что происходит, когда вы используете на нем код:

test1(); //runs the function as expected
console.log(test1.name); //prints 'test1'

Итак, если вы выполните следующее:

obj1.func = test1;

Затем вы сможете ссылаться на obj1.func.name, и он вернет 'test1'.

Ответ 6

Это, вероятно, лучший способ сделать это:

var myfunc = function () {};
var funcName = myfunc.constructor.name;

Это можно сделать за пределами функции, и вы можете проверить ее в контексте консоли браузера.

Счастливое кодирование!

Ответ 7

Вы можете преобразовать вашу функцию в строку (fn + '') и разбить ее позже на пробел и открыть скобку /\s|\(/.

var getFunctionName = function (fn) {
   return (fn + '').split(/\s|\(/)[1];
};