2011-08-01 68 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);