在不使用名称/ arguments.callee的情况下引用当前函数

时间:2012-12-27 18:56:52

标签: javascript closures

我做了大量研究,但未能找到任何答案,看似简单的问题:

我想将一个属性与一个函数相关联(在这个函数中用作一个静态变量),如下所示:

function foo() {
    if (!foo.counter) {
        foo.counter = 1;
    }
    else {
        foo.counter++
    }
    // rest of the function code goes here...
}

如果我稍后更改了该函数的名称,我不想在函数定义中更改对它的引用。 那么,有没有办法引用当前正在执行的函数? (现在已弃用的arguments.callee除外)。关键字如thisFunction

如果没有,那么没有这样的东西是什么原因?

3 个答案:

答案 0 :(得分:3)

我不知道JavaScript公开的标识符或关键字,如thisFunctionarguments.callee除外),但实现相同效果的一种方法是将函数命名为foo闭包,并从该闭包返回foo。这样,您可以始终使用foo中的名称foo来引用自身,无论您的程序分配了哪个变量:

var fn = (function() {
  function foo() {

     if (!foo.counter) {
        foo.counter = 1;
    }
    else {
        foo.counter++
    }
    // rest of the function code goes here...
  }

  return foo;
})();

答案 1 :(得分:0)

function foo() {
  if (typeof foo.counter=="undefined") {
    foo.counter = 1;
  }
  else {
    foo.counter++
  }
  return foo;
}

var x = new foo();
alert(x.counter);  //1
var y = new foo();
alert(x.counter); //2

答案 2 :(得分:0)

如果您不需要在功能之外参考计数器,这将有效。您可以在函数外部定义一个变量,而不是设置函数本身的变量,而是让函数修改它。每次调用makeFoo时,它都会生成一个新变量x并使用x返回一个函数。每次调用返回的函数时,它仍然引用由x创建的相同makeFoo。另外,这完全封装了变量,确保返回函数之外几乎没有任何东西可以改变它(它肯定不会被返回函数之外的大多数东西改变,但是有足够的时髦javascript反射,我不能保证什么都不会改变它)。当然,在变量之间移动函数不会影响计数器(即x=makeFoo();y=x;x=null;)。

function makeFoo() {
  var x=0;
  return function () {
    x++;
    return x;
  }
}

//different counters
x=makeFoo();
y=makeFoo();
x();//returns 1
y();//returns 1
x();//returns 2
y();//returns 2

//same counter
x=makeFoo();
y=x;
x();//returns 1
y();//returns 2
x();//returns 3
y();//returns 4