Хорошо, я не знаю, как сформулировать заголовок для этого вопроса.
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. то есть изменение
for item in data.contents
в
data.contents.forEach (item) ->
Но я хотел бы знать, почему лямбда-функция не фиксирует текущее значение переменных.