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
可能是一种额外的优化模式,因为它可以从代码中省略对初始化的测试。这两种技术的结合