0

私はこれを行ういくつかのコードで作業しています:

var _init = false;

this.init = function(){

    if(_init)
        return;
    else
        _init = true;

    // Do a bunch of stuff here
}

そこには、排除したい小さな競合状態があるように思えます。最初のインスタンスがtrueinitに設定される前に、関数の 2 番目のインスタンスが実行を開始する可能性があります。_init可能性は低いですが、ゼロではありませんよね?

それを考えると、シングルトンパターンのようなものを除いて、この競合状態を排除する簡単な方法はありますか?

4

2 に答える 2

4

javascript はシングル スレッド (当面は Web ワーカーを無視) であるため、競合状態は発生しないはずです。

ただし、これを行う「標準的な」方法は、自己呼び出し関数を使用することだと思います

(function(){
    // init stuff here, but you don't need to have any of the _init stuff
})() // <-- this causes your function to be invoked immediately
于 2011-10-05T19:48:24.330 に答える
0

関数が1回だけ実行されるようにする簡単な方法のひとつは、最後にメソッドを削除することです。

this.init = function(){
    // Do a bunch of stuff here

    // now delete:
    delete this.init;
}

または、プロパティを再度呼び出す必要がある場合は、プロパティをno-opに再割り当てできます。

this.init = function(){
    // Do a bunch of stuff here

    this.init - function() {};
}

ただし、これにより、関数がインスタンスごとに1回実行されることが保証されます。1回だけ実行する必要がある場合は、フラグベースのアプローチの方がおそらく優れています。他の投稿者が示唆しているように、競合状態に関する心配は、単一の場合でも根拠がありません。スレッド化されたコード。

于 2011-10-05T19:59:57.623 に答える