[英]Make a function run once by redefining
我發現自己最近使用此模式進行了初始化,該初始化只能運行一次:
function myInit() {
// do some initialization routines
myInit = function () {return;};
}
這樣,如果我有兩種不同的方法需要myInit做一些事情,它將確保它只能運行一次。 看到:
function optionA() { myInit(); doA(); }
function optionB() { myInit(); doB(); }
在我的腦后,我覺得我正在丟失某些東西,我不應該這樣做。 有什么原因為什么我不應該這樣寫代碼?
有什么原因為什么我不應該這樣寫代碼?
原因之一是該函數只能在定義的范圍內按預期工作。例如,如果將函數傳遞到其他地方,則不會受到修改的影響,並且在最壞的情況下會創建隱式全局變量。 例如
function myInit() {
// do some initialization routines
myInit = function () {return;};
}
function foo(init) {
init();
init();
}
foo(myInit);
更好的方法是封裝整個邏輯:
var myInit = (function() {
var initialized = false;
return function() {
if (initialized) return;
initialized = true;
// do some initialization routines
};
}());
現在,無論如何,何時何地調用myInit
,它將僅執行一次初始化步驟。
也許您可以做類似的事情,
var myInitCalled = false; // Global declaration of flag variable
function myInit() {
// do some initialization routines
myInitCalled = true; // Setting the global variable as true if the method is executed
myInit = function () {return;};
}
然后,在您的方法中,您可能可以使用:
function optionA()
{
if(!myInitCalled ) // Checking if first time this is called.
{myInit();}
doA();
}
function optionB()
{
if(!myInitCalled )
{myInit();}
doB();
}
這將確保myInit僅被調用一次!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.