我经常需要在函数f
中检索指向f
的方法的名称。例如。假设我们有getMethodName(obj, methodFunction)
函数使用foreach
上的obj
来查找属于methodFunction
的链接的属性:
obj = {
foo : function() {
var myName = getMethodName(obj, arguments.callee); // "foo"
}
}
如何在严格模式中弃用arguments.callee
?
答案 0 :(得分:4)
你不能这样做。你不应该首先这样做,这是神奇的,你的功能不应该依赖于它的调用者等。改变你的设计,以使它再次工作。
arguments.callee
和.caller
不仅因为风格不好而被删除,还因为它们打败了优化。即内联,如果依赖于调用者,也不能依赖函数,则无法内联某些内容,因为代码可能只是放在没有函数的地方。
阅读:http://whereswalden.com/2010/09/08/new-es5-strict-mode-support-now-with-poison-pills/
答案 1 :(得分:1)
值得指出的是,因为我无法判断你是否认为它,如果你只是在对象文字中为函数提供一个名称,你就可以这样说:
obj = {
foo : function METHODNAME() {
var myName = getMethodName(obj, METHODNAME); // "foo"
}
}
但要注意:我认为IE在发布版本中有一个错误,它将在封闭范围内定义一个名为METHODNAME
的函数(而不是仅使该函数可访问)。但是,根据规范,只要您使用在函数本身中找不到的名称,或者在函数可以调用eval
的情况下传递给eval
的代码,这就完全可以了。 / p>