我发现自己最近使用此模式进行了初始化,该初始化只能运行一次:

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,它将仅执行一次初始化步骤。

关于javascript - 通过重新定义使函数运行一次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24255237/

10-13 01:12