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

Function.name не поддерживается в IE.

В последнее время я стал большим поклонником свойства function.name.

Например, я написал функцию для расширения прототипов.

Это работает на пути.

Array.give(
    function forEach() { ... }
);

.., который затем позволит вам сделать.

['a', 'b', 'c'].forEach(function () { ... });

Этот код отлично работает в Chrome, Safari, Firefox и Opera, но не в IE.

После небольшого разворота я понял, что для функции give function.name просто возвращал undefined, где, как и во всем остальном, он возвращал "forEach".

Есть ли альтернативный способ получить имя в IE, или я просто не влюбился в эту замечательную собственность?

4b9b3361

Ответ 1

Возможно, вы сможете проанализировать имя функции, вызвав function.toString [docs]. function.name не стандартное свойство.

var name = func.toString().match(/^function\s*([^\s(]+)/)[1];

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

Array.give({
    forEach: function() { ... },
    somethingElse: function() {...}
});

Ответ 2

Вы можете использовать Object.defineProperty, чтобы добавить его поддержку в IE9 +

// Fix Function#name on browsers that do not support it (IE):
if (!(function f() {}).name) {
    Object.defineProperty(Function.prototype, 'name', {
        get: function() {
            var name = (this.toString().match(/^function\s*([^\s(]+)/) || [])[1];
            // For better performance only parse once, and then cache the
            // result through a new accessor for repeated access.
            Object.defineProperty(this, 'name', { value: name });
            return name;
        }
    });
}

Ответ 3

Я думаю, что ваше решение .give() немного. Что случилось с:

Array.prototype.forEach = function () { ... };

?

Действительно, вы должны проверить существование такого метода перед тем, как предоставить свой собственный:

Array.prototype.forEach = Array.prototype.forEach || function () { ... };

Так как другие будут здесь задаваться вопросом о function.name, есть способ захватить имя (очевидно, он не работает на анонимных функциях):

function getFnName(fn) {
    return (fn.toString().match(/function (.+?)\(/)||[,''])[1];
}

Ответ 4

Для тех, кто находится в одной лодке, взгляните на JamesMGreene Function.name polyfill. Это выглядит как хорошее решение.

Ответ 5

Старый вопрос, и я не знаю, работает ли это в родном браузере IE 7 и 8 (я использую эмулятор инструментов для разработчиков), но я дал функции свойство name в конструкторе для gag, вызывающего IE код до....

function sayMyName(func){
    var name=func.name || func.constructor.name
    alert(name);

}

var ieGivesMeNightTerrors=function(){
    //there there, these ugly workarounds aren't your fault
};
ieGivesMeNightTerrors.constructor.name=ieGivesMeNightTerrors;
sayMyName(myFunc);