Dobra, nie wiem jak określić tytuł tego pytania.Zamknięcie nie zostało przechwycone? - 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"
Rozumiem, że zmienna jest zdefiniowana pod itemBox
zakresu openDir
jest tutaj. Ale skoro wskazana linia jest w funkcji lambda, to czy nie powinien on przechwytywać obiektu przywoływanego przez itemBox
zakresu nadrzędnego, zamiast otrzymywać zmutowany do ostatniego obiektu, do którego się odwołuje?
Mówiąc jasno, oczekuję, że program obsługi kliknięcia każdego z nich itemBox
wykona dla siebie addClass "selected"
. Ale tak się składa, że itemBox
w każdej z procedur obsługi kliknięć zawsze odnosi się do ostatniego elementu.
Mogę łatwo to naprawić, zmieniając miejsce, gdzie zostanie zadeklarowany itemBox. tj zmieniając
for item in data.contents
do
data.contents.forEach (item) ->
Ale chciałbym wiedzieć, dlaczego funkcja lambda nie przechwytywać zmiennych aktualną wartość.
Pytanie dotyczy także zmiennej 'item' wymienionej w linii' openDir item.path', nawet jeśli jest ona zdefiniowana w zakresie 'openDir's. –