我正在使用一些执行此操作的代码:
var _init = false;
this.init = function(){
if(_init)
return;
else
_init = true;
// Do a bunch of stuff here
}
在我看来,那里有一个很小的竞争条件,我想消除。在第一个实例将init
设置为true之前,_init
函数的第二个实例可能会开始运行。不太可能,但非零,是吗?
鉴于此,是否有一种直接的方法可以消除这种竞争条件,而不是像Singleton模式那样?
答案 0 :(得分:4)
javascript是单线程的(暂时忽略网络工作者)所以你应该没问题 - 应该没有竞争条件。
我认为这样做的“标准”方式是使用自我调用函数
(function(){
// init stuff here, but you don't need to have any of the _init stuff
})() // <-- this causes your function to be invoked immediately
答案 1 :(得分:0)
确保函数只运行一次的一种简单方法就是删除最后的方法:
this.init = function(){
// Do a bunch of stuff here
// now delete:
delete this.init;
}
或者您可以将该属性重新分配给无操作,如果您需要再次调用它:
this.init = function(){
// Do a bunch of stuff here
this.init - function() {};
}
但是这只能确保函数运行一次每个实例 - 如果你需要它只运行一次,永远,你的基于标志的方法可能更好,并且正如其他海报所暗示的那样,你对单一线程代码的竞争条件的担忧是没有根据的。