さて、私はこの質問のタイトルをどのようにフレーズするかわかりません。クロージャスコープはキャプチャされませんか? - Coffeescript
openDir = (path) ->
socket.emit "get_metadata", path, (data) ->
columnBox = $ "<div/>", class: "columnbox"
for item in data.contents
itemBox = $ "<div/>", class: "itembox"
itemBox.click ->
columnBox_inner.children().removeClass "selected"
itemBox.addClass "selected" # <<<--- Over here
openDir item.path
columnBox.append itemBox
columnBox.appendTo "#columnscontainer"
私は変数itemBox
がここopenDir
の範囲に定義されていることを理解しています。しかし、指摘された行がラムダ関数にあるので、itemBox
は、参照される最後のオブジェクトに変更されるのではなく、親スコープのitemBox
によって参照されるオブジェクトをキャプチャするべきではありませんか?
明らかに言えば、私はそれぞれitemBox
のクリックハンドラが自分自身にaddClass "selected"
を実行すると期待しています。しかし、クリックハンドラのそれぞれのitemBox
は、常に最後のitemBoxを参照します。
itemBoxが宣言される場所を変更することで、これを簡単に修正できます。すなわち
data.contents.forEach (item) ->
に
for item in data.contents
を変更しかし、私はラムダ関数は、変数の現在値をキャプチャしていない理由を知りたいのですが。
質問は 'openDir item.path'行で参照される' item'変数にも適用され、 'openDir'のスコープで定義されています。 –