【发布时间】:2012-08-13 08:05:20
【问题描述】:
好的,我不知道如何表达这个问题的标题。
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 的范围内定义的。但是由于指出的行在 lambda 函数中,所以 itemBox 不应该在那里捕获父作用域的 itemBox 引用的对象,而不是突变为它引用的最后一个对象吗?
说清楚,我希望每个itemBox 的点击处理程序对自己执行addClass "selected"。但是发生的情况是每个点击处理程序中的itemBox 总是引用最后一个 itemBox。
我可以通过更改 itemBox 的声明位置来轻松解决此问题。即改变
for item in data.contents
进入
data.contents.forEach (item) ->
但我想知道为什么 lambda 函数不捕获变量当前值。
【问题讨论】:
-
这个问题也适用于
openDir item.path行中引用的item变量,因为即使它是在openDir的范围中定义的。
标签: scope coffeescript