如果你想那個狀態存儲在功能實例,給函數名,並使用在它內部的名字:
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
由於這個原因而投票結束是世界的結局。 –