Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过重新定义使函数运行一次_Javascript_Performance - Fatal编程技术网

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

Javascript 通过重新定义使函数运行一次,javascript,performance,Javascript,Performance,我最近发现自己使用此模式进行初始化,该初始化应该只运行一次: 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;};
}
这样,如果我有两个不同的方法需要myInit做的事情,它将确保它只运行一次。见:

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

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

也许你可以这样做

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只被调用一次

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

一个原因是该函数只能在其定义的范围内按您的意愿工作。例如,如果您将函数传递到其他地方,它将不会受到您的修改的影响,在最坏的情况下,将创建一个隐式全局变量。例如

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

全局使用一个标志变量,并且仅当尚未设置标志时才调用myInit。此递归将严重阻碍您的处理。尝试改用
setTimeout(函数,1)
。或者任何小值。@MarkGabriel:你在哪里看到递归?等等。很抱歉我的错。将
doA()
读作
optionA()
和B一样。不过,将新函数分配给
myInit
可能是一种额外的优化模式,因为它可以从代码中省略对
初始化的测试。这两种技术的结合