さて、この質問のタイトルの言い方がわかりません。
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"
変数がのスコープ here のitemBox
下で定義されていることを理解しています。openDir
しかし、指摘された行はラムダ関数内にあるため、親スコープによって参照される最後のオブジェクトに変更されるのではなく、親スコープitemBox
によって参照されるオブジェクトをキャプチャするべきではありませんか?itemBox
わかりやすく言うと、それぞれのクリック ハンドラーがそれ自体itemBox
に対して実行addClass "selected"
されることを期待しています。しかし、何が起こるかというとitemBox
、各クリック ハンドラーで常に最後の itemBox が参照されます。
itemBox が宣言される場所を変更することで、これを簡単に修正できます。つまり、変化する
for item in data.contents
の中へ
data.contents.forEach (item) ->
しかし、ラムダ関数が変数の現在の値をキャプチャしない理由を知りたいです。