1

我已经做了相当多的研究,但还没有找到任何答案,这似乎是一个简单的问题:

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

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

如果我稍后更改函数的名称,我不想在函数定义中更改对它的引用。那么,有没有办法引用当前正在执行的函数呢?(arguments.callee现在不推荐使用的除外)。一个像thisFunction?

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

4

3 回答 3

3

我不知道 JavaScript 公开的标识符或关键字thisFunction(除了arguments.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;
})();
于 2012-12-27T19:08:56.777 回答
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
于 2012-12-27T19:16:08.010 回答
0

如果您不需要在函数之外引用计数器,这将起作用。不是设置函数本身的变量,而是在函数外部定义一个变量,然后让函数修改它。每次调用时makeFoo,它都会创建一个新变量x并使用x. 每次调用返回的函数时,它仍然引用xmakeFoo. 此外,这完全封装了变量,确保返回函数之外几乎没有任何东西可以改变它(它肯定不会被返回函数之外的大多数东西改变,但是有足够的时髦的 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
于 2012-12-28T04:54:08.137 回答