如果你想那个状态存储在功能实例,给函数名,并使用在它内部的名字:
var myObject = {
myFunction: function theFunctionName() {
// ^^^^^^^^^^^^^^^--------------------- name
var firstTime = Boolean(!theFunctionName.lastRetry);
// ^--------------------------- using it
if (firstTime) {
theFunctionName.lastRetry = Date.now();
// ^------------------------------------------------ using it
return true;
}
// some more code
}
};
你会怎么做,只要你想递归的使用功能好。当你以这种方式给某个函数命名(在function
之后和(
之前放置该名称)时,该名称在该函数自己的代码范围内。 (这不是在范围内包含的功能,如果它是一个函数表达式的代码,但如果它是一个函数声明。您是一个表达式。)
这是一个命名函数表达式(而在以前,你有一个匿名函数表达式)。您可能会听到关于NFE的警告,但各种JavaScript实现与他们有关的问题基本上是过去的。 (IE8仍然处理这些错误,但 - 更加this post on my blog)
你可能会考虑保持这种状态某处私人,虽然,通过IIFE:
var myObject = (function(){
var lastRetry = null;
return {
myFunction: function() {
var firstTime = Boolean(!lastRetry);
if (firstTime) {
lastRetry = Date.now();
return true;
}
// some more code
}
};
})();
现在,没有什么外部匿名函数外部可以看到lastRetry
。 (而且你不必担心IE8,如果你支持固执XP用户:-))。
旁注:一元!
操作总是返回一个布尔值,让您的
var firstTime = Boolean(!theFunctionName.lastRetry);
...是完全等同于:
var firstTime = !theFunctionName.lastRetry;
...但有一个额外的不必要的函数调用。 (并不是说它伤害了任何东西。)
你的意思是像...... SkyNet? –
是的,这是可能的。你只想要一个实例吗? (顺便说一下,在上面的代码中你不需要'Boolean()'包装器。) – nnnnnn
由于这个原因而投票结束是世界的结局。 –