2011-01-09 52 views
3

我經常需要在函數f中檢索指向f的方法的名稱。例如。比方說,我們有一個使用上objforeach找到一個屬性,它是一個鏈接到一個methodFunction功能getMethodName(obj, methodFunction)在嚴格模式JavaScript中檢索「自我」函數

obj = { 
    foo : function() { 
     var myName = getMethodName(obj, arguments.callee); // "foo" 
    } 
} 

怎樣在嚴格模式做到這一點,其中arguments.callee已經過時?

回答

4

你不能這樣做。你不應該這樣做,這是魔術,你的功能不應該取決於它的來電等。改變你的設計,以使其重新工作。

arguments.callee.caller不僅因爲風格不好而被刪除,還因爲它們打敗了優化。即內聯,如果你依賴調用者,也不能在函數中內聯某些東西,因爲代碼可能只是放在沒有函數的地方。

閱讀:http://whereswalden.com/2010/09/08/new-es5-strict-mode-support-now-with-poison-pills/

+0

爲什麼文章以「tl; dr」開頭?我知道這通常意味着什麼,但不是在這種情況下。 – 2011-01-09 18:58:34

+0

@Sime好吧我想作者只是在這裏開玩笑說他的文章基本上是一個文字的巨大壁壘 – 2011-01-09 19:03:32

1

值得指出的是,因爲我不能告訴你,如果考慮它,如果你只是在該對象提供一個名稱的功能文字,你可以參考這種方式:

obj = { 
    foo : function METHODNAME() { 
     var myName = getMethodName(obj, METHODNAME); // "foo" 
    } 
} 

但要注意:我認爲IE瀏覽器在發佈的版本在那裏,這將定義一個在封閉範圍內命名METHODNAME功能中的錯誤(而不是爲完善功能只能訪問)。然而,根據規範,這是完美的猶太教和完美的罰款,只要你使用一個名稱不在函數本身的任何地方,或者在代碼傳遞給eval,如果該函數可以調用eval