以严格模式复制arguments.callee

whe*_*hys 9 javascript scope function strict

我是第一次以严格模式工作,而且,知道,这也是多年来第一次能够使用非严格模式属性将是有用的.我的问题在这里概述了我遇到的确切问题,但是如果我仍然可以访问arguments.callee,那么我已经解决的解决方案可以适应更大的可扩展性.

没有命名函数是否有任何方式在严格模式下,我可以获得对我目前在其范围内的函数的引用?

T.J*_*der 5

没有命名函数是否有任何方式在严格模式下,我可以获得对我目前在其范围内的函数的引用?

不,您必须为该功能命名.我的错误,我想到了一种方法,请看下面的最后一个代码块.我不喜欢它,但我们有.:-)

请注意,您在此处为函数命名的方式如下:

UsageGraph = Graph.extend({
   generateScale: function GS() {
       var parentMethod = this.constructor._super.generateScale;
       if(parentMethod === GS) {
           parentMethod = this.constructor._super.constructor._super.generateScale;
       }
       parentMethod.call(this); // run the parent's method
       //do additional stuff
   }
})
Run Code Online (Sandbox Code Playgroud)

...使用命名函数表达式.这些在实现中是非常不可靠的(链接,链接)(它们不应该是,但是),最值得注意的是在上面的示例中,IE8和更早版本将创建两个完全独立的函数对象,将其中一个分配给generateScale属性并引用函数中的不同函数对象GS.

但是很容易修复:

UsageGraph = Graph.extend(function(){
   function GS() {
       var parentMethod = this.constructor._super.generateScale;
       if(parentMethod === GS) {
           parentMethod = this.constructor._super.constructor._super.generateScale;
       }
       parentMethod.call(this); // run the parent's method
       //do additional stuff
   }

   return {generateScale: GS};
}())
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的不希望函数有一个名字(我更喜欢它们有名字,帮助我的工具帮助我,但是嘿),你可以在该闭包中使用本地:

UsageGraph = Graph.extend(function(){
   var GS = function() {
       var parentMethod = this.constructor._super.generateScale;
       if(parentMethod === GS) {
           parentMethod = this.constructor._super.constructor._super.generateScale;
       }
       parentMethod.call(this); // run the parent's method
       //do additional stuff
   };

   return {generateScale: GS};
}())
Run Code Online (Sandbox Code Playgroud)

现在您有一个匿名函数,但可以从中引用GS它.再一次,我不推荐它,因为那时你看不到调用堆栈中的函数名称等等,但你确实说过没有给函数命名,所以...