我做了大量研究,但未能找到任何答案,看似简单的问题:
我想将一个属性与一个函数相关联(在这个函数中用作一个静态变量),如下所示:
function foo() {
if (!foo.counter) {
foo.counter = 1;
}
else {
foo.counter++
}
// rest of the function code goes here...
}
如果我稍后更改了该函数的名称,我不想在函数定义中更改对它的引用。
那么,有没有办法引用当前正在执行的函数? (现在已弃用的arguments.callee
除外)。关键字如thisFunction
?
如果没有,那么没有这样的东西是什么原因?
答案 0 :(得分: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;
})();
答案 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