我发现自己最近使用这种模式进行初始化,只能运行一次:
function myInit() {
// do some initialization routines
myInit = function () {return;};
}
这样,如果我有两种不同的方法需要myInit做的事情,那么它将确保它只运行一次。参见:
function optionA() { myInit(); doA(); }
function optionB() { myInit(); doB(); }
在我的脑后,我觉得我错过了一些东西,我不应该这样做。我有什么理由不写这样的代码吗?
答案 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 !!