簡體   English   中英

通過重新定義使函數運行一次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM