防止函数在JavaScript中多次运行

时间:2011-10-05 19:47:06

标签: javascript singleton-methods

我正在使用一些执行此操作的代码:

var _init = false;

this.init = function(){

    if(_init)
        return;
    else
        _init = true;

    // Do a bunch of stuff here
}

在我看来,那里有一个很小的竞争条件,我想消除。在第一个实例将init设置为true之前,_init函数的第二个实例可能会开始运行。不太可能,但非零,是吗?

鉴于此,是否有一种直接的方法可以消除这种竞争条件,而不是像Singleton模式那样?

2 个答案:

答案 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() {};
}

但是这只能确保函数运行一次每个实例 - 如果你需要它只运行一次,永远,你的基于标志的方法可能更好,并且正如其他海报所暗示的那样,你对单一线程代码的竞争条件的担忧是没有根据的。