2016-07-06 8 views
3

私のコールバック関数が前に定義した変数xを必要とするクロージャです。このバグ私は、しかし、私は多くは、この代わりに...閉鎖代替

function main() { 
    var x = "Something"; 

    foo('do stuff', bar); 
} 

function bar(stuffResponse) { 
    var y = x + stuffResponse; 
} 

しかし、明らか場合のように私のコードを書くことを好むので、私は私のbar機能は、自身の外で変数を依存するが、すべてのほとんどのことを好きではないとして、私はこれを行うbarは何も考えていないxはもうです。前者の機能を維持しながら後者のスタイルを達成するきれいな方法はありますか?

+1

私はクロージャに頼るのを避ける理由はありません。しかし、あなたはいつも 'bar() 'の引数として' x'を渡すことができます – haim770

+0

これは本当に問題ではない単純な例です。もっと複雑になり、クロージャの中にもっと多くのものが必要です続く。そして、コールバック関数として使用される 'bar()'の引数として 'x'を渡すことはできません。 –

+0

本当に' x'がクロージャの外側のスコープで定義されている必要がありますか?この必要性)。スニペットを更新して、達成しようとしているものに近いものを表示できますか? –

答えて

0

コメントに記載されているとおり、あなたが達成しようとしていることは、変数をコールバックにバインドすることで実現できます。それは代わりに、元の変数を参照のあなたの値のコピーをあげる:またthis代わりのnullバインドすることができ

function main() { 
    var x = "Something"; 

    foo('do stuff', function bar(x, stuffResponse) { 
     var y = x + stuffResponse; 
    }.bind(null, x)); 
} 

。しかし、あなたがthisを使用していないので意味がありません。

+0

ありがとう、ちょうど私が必要としたもの、コールバックに変数をきれいに渡す方法、グローバルを作成せずに、またはクロージャを使用すること。 –

+0

これを行う目的が何であるか、または私が知らないOPの質問に答える理由は大いに不明です。 –

+0

@torazaburo私は、OPの目的は、JSの非同期性で、コールバックの前にコールバック以外のスコープで何かが定義されたときに何かが変更されると、結果が一致しない可能性を排除することだと思います。ですから、コールバックには 'x'の_current_値を使いたいと思っていました。 – Dencker

4

  1. パラメータとして渡さを関数に渡す。
  2. 関数内で宣言されています。
  3. グローバルに宣言されています
  4. 囲みスコープから利用できます。

xを利用可能にするかどうかを決定する必要があります。 4で何も悪いことはありません。 2はここでは適用されません。 3は避けなければならない。 1は、状況に応じて合理的な選択肢です。

+0

私はクロージャーに問題はありませんが、私がそれらを使用することは時々望ましくないことがあり、私は代わりを探していました。私は、自分の感情がより良いやり方を探していることを理解していません。 –