2011-08-01 57 views
13

最近我已经成为function.name物业的巨大粉丝。IE中不支持function.name。

例如,我写了一个扩展原型的函数。

它的工作原理的方式..

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

然后..这将让你做..

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

这个代码在Chrome,Safari浏览器,火狐和Opera的伟大工程,但不在IE中。

经过一小会儿的挖掘,我意识到给予函数function.name刚刚返回undefined,在那里它和其他所有返回"forEach"一样。

是否有另一种方式在IE中获得该名称,或者我应该从这个美妙的属性爱?

+4

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/name - 说*非标准*。 –

+5

什么是'.give()'?你在哪里使用'function.name'? – Tomalak

+0

@Felix好吧。 :\那么爱就是这样。 – Kayla

回答

21

您也许能够从通话function.toString[docs]解析函数名。 function.namenot a standard property

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

正如评论也说,这并不一定是可靠的方法。伊莫传递对象会更容易阅读,你可以一次过几种方法:

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

这将是一个痛苦,但它看起来像它是可能的 – Kayla

+0

我实际上已经有支持对象和多个函数参数的提及设置的方法 – Kayla

+1

我严重建议不要解析函数的输出'toString()'方法来获取名称,没有任何保证 –

7

我认为你的.give()解决方案是一点点......绝对是。怎么了:

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

真的,但是,你应该检查这种方法的存在提供自己的面前:

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

因为其他人会在这里领导想了解function.name,有抢命名方式(显然,它不会对匿名函数工作):

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

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

+2

这与字面问题无关。 -1 – Kayla

+0

我编辑它。现在确实如此。事实上,它已经与这个问题有关,因为你正在问关于覆盖原生方法。 – James

27

您可以使用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; 
     } 
    }); 
} 
+0

我改变了正则表达式在所有这些情况下都能正常工作:function(){},function(){},function test(){},function test(){} –

+1

\ w *您可能想要使用\ S *如果函数名具有Unicode字符 – alex

+0

@alex我不知道函数名可以使用unicode名称。您确定是这种情况吗? –

0

对于这些,谁是在同一条船上,看看JamesMGreene的Function.name polyfill。这看起来是一个很好的解决方案。

0

老问题,我不知道这是否适用于本机IE浏览器(我正在使用开发工具模拟器),但我已经给函数一个名称属性的构造函数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);