10

我第一次在严格模式下工作,你知道吗,这也是多年来第一次能够使用非严格模式属性会很有用。我的问题在这里概述了我遇到的确切问题,但如果我仍然可以访问arguments.callee,我制定的解决方案可以适应更具可扩展性的东西。

在不命名函数的情况下,有什么方法可以在严格模式下获得对我当前范围内的函数的引用?

4

2 回答 2

5

在不命名函数的情况下,有什么方法可以在严格模式下获得对我当前范围内的函数的引用?

在 2012年最初编写此答案时,您在链接解决方案中使用的命名函数表达式存在实现错误。现在还没有,自从带有这些错误的浏览器仍然大量流通以来已经有好几年了。因此,在(非常)后 IE8 世界中,您的命名函数表达式方法很好:

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

但问题是你是否可以避免拥有名字。在 2012 年,如果您真的不希望函数有名称,我的解决方案是将匿名函数分配给变量:

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

但这不再起作用了;自 ES2015 以来,即使该函数也有一个名称,从它分配给的变量的名称推断:

var GS = function() { };
console.log(GS.name); // "GS"

如果你真的不希望它有名字,可以避免它,但你必须努力打破规范定义的自动命名,例如通过使函数成为另一个函数的返回值:

var GS = (() => function() { })();
console.log(GS.name); // ""

因此,如果避免使用名称很重要,您将执行以下操作:

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

   return {generateScale};
}());
于 2012-04-04T11:00:21.463 回答
0

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

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

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

http://jsfiddle.net/4y8pY/

于 2012-04-04T10:56:56.020 回答