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, или я просто не влюбился в эту замечательную собственность?
Ответы
Ответ 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);