通过重新定义使函数运行一次

时间:2014-06-17 03:24:19

标签: javascript performance

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

function myInit() {
  // do some initialization routines
  myInit = function () {return;};
}

这样,如果我有两种不同的方法需要myInit做的事情,那么它将确保它只运行一次。参见:

function optionA() { myInit(); doA(); }
function optionB() { myInit(); doB(); }

在我的脑后,我觉得我错过了一些东西,我不应该这样做。我有什么理由不写这样的代码吗?

2 个答案:

答案 0 :(得分:2)

  

我有什么理由不写这样的代码吗?

一个原因是该功能仅在您定义的范围内有效。例如。如果你在其他地方传递函数,它不会受到你的修改的影响,在最坏的情况下会创建一个隐式的全局变量。 E.g。

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的方式,地点和时间,它都只会执行一次初始化步骤。

答案 1 :(得分:0)

可能你可以做点什么,

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 !!