是否有可能获得给定闭包运行的函数名称?

时间:2011-08-16 12:29:54

标签: javascript

function MyFunction() {
  closure = function() {
    alert('my parent function name is: '/* now what here ? */);
  }
  closure();
}
MyFunction();

结果应为my parent function name is: MyFunction

(对版主:我不知道为什么stackoverflow阻止我发送这个问题,声称它不符合质量标准。我是否必须输入一些多余的文本才能发送它。)

3 个答案:

答案 0 :(得分:3)

这是/ 可能,但它受到限制。第一个限制,并非所有Javascript引擎都支持以下模式,第二个(更具戏剧性), ES5严格模式也不支持它。

某些Javascript引擎允许您访问.__parent__属性,该属性是对父作用域的引用。这看起来应该是

alert('my parent is ' + this.__parent__.name );

您必须在其中调用new closure(),或者为该函数指定名称并使用该名称而不是this

但是,大多数实现都为了安全问题而删除了该访问权限。您可能已经注意到,您可以通过访问父上下文来破坏“全能”关闭安全性。


实现它的另一种方法是访问arguments.callee.caller,这在 ES5严格模式中也无法访问。看起来像:

function MyFunction() {
  closure = function f() {
    alert('my parent function name is: ' +  arguments.callee.caller.name);
  }
 closure();
}
MyFunction();

答案 1 :(得分:2)

function MyFunction() {
  closure = function() {
    alert('my parent function name is: ' + arguments.callee.caller.name);
  }
  closure();
}
MyFunction();

答案 2 :(得分:1)

function MyFunction() {
    var functionName = arguments.callee.name,
    closure = function() {
        alert('my parent function name is: ' + functionName);
    }
    closure();
}
MyFunction();