Okay, ich weiß nicht, wie man den Titel für diese Frage formuliert.Closure Scope nicht erfasst? - 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"
Ich verstehe, dass die Variable itemBox
hier unter openDir
‚s Umfang definiert ist. Aber da die aufgezeigte Linie in einer Lambda-Funktion ist, sollte nicht das itemBox
Objekt von itemBox
des übergeordneten Bereichs referenziert statt mutiert zu dem letzten Objekt referenziert werden?
Um es klar zu sagen, erwarte ich, dass die Click-Handler von jedem itemBox
addClass "selected"
zu sich selbst durchführen. Aber was passiert, ist, dass sich in jedem Klick-Handler immer auf die letzte itemBox bezieht.
Ich kann das leicht beheben, indem Sie ändern, wo itemBox deklariert wird. das heißt Ändern
for item in data.contents
in
data.contents.forEach (item) ->
Aber ich würde gerne wissen, warum die Lambda-Funktion nicht die Variablen aktuellen Wert nicht erfassen.
Die Frage gilt auch für die Variable 'item', die in der Zeile 'openDir item.path' referenziert wird, da auch diese im' openDir'-Bereich definiert wird. –