function MyFunction() { closure = function() { alert('my parent function name is: '/* now what here ? */); } closure(); } MyFunction();
结果应该是我的父函数名是:MyFunction
(对于主持人:我不知道为什么stackoverflow阻止我发送这个问题声称它不符合质量标准.我是否必须输入一些多余的文本才能发送它.)
解决方法
这是可能的,但它受到限制.第一个限制,并非所有Javascript引擎都支持以下模式,第二个(更具戏剧性),ES5严格模式也不支持它.
一些Javascript引擎允许您访问.__ parent__属性,该属性是对父作用域的引用.那应该是这样的
alert('my parent is ' + this.__parent__.name );
你必须在哪里调用new closure(),或者给函数命名并使用该名称而不是这个名称.
但是,大多数实现都会删除该访问以解决安全问题正如您可能已经注意到的那样,您可以通过访问父上下文来破坏“全能”关闭安全性.
完成它的另一种方法是访问arguments.callee.caller,它也无法在ES5严格模式下访问.好像:
function MyFunction() { closure = function f() { alert('my parent function name is: ' + arguments.callee.caller.name); } closure(); } MyFunction();