以严格模式复制arguments.callee

时间:2012-04-04 10:54:22

标签: javascript function scope strict

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

如果没有命名函数,那么在严格模式下我可以获得对我目前所在范围内的函数的引用吗?

2 个答案:

答案 0 :(得分: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
   }
})

...使用命名函数表达式。众所周知,这些(linklink)在各个实现中都是不可靠的(它们不应该,但是是),最明显的是在上面的示例中,IE8和更早版本将创建< strong>两个完全独立的函数对象,将其中一个赋值给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};
}())

或者如果你真的不希望函数有一个名字(我更喜欢它们有名字helps my tools help me,但是嘿),你可以在那个闭包中使用一个本地:

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};
}())

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

答案 1 :(得分:0)

是的,但不是......我不确定这是否与您所说的“命名”方式相同:

var foo = function bob() {
    // call bob();
}

// bob is undeclared; here it's foo!

http://jsfiddle.net/4y8pY/