Объем закрытия не захвачен? — Кофескрипт

Хорошо, я не знаю, как сформулировать заголовок для этого вопроса.

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) ->

Но я хотел бы знать, почему лямбда-функция не фиксирует текущее значение переменных.

5
задан Gautham Badhrinathan 16 August 2012 в 22:15
поделиться