Джеймс правильно диагностировал проблему: когда вы передаете функцию в setTimeout
, она вызывается в контексте window
(как если бы вы вызывали func
как func()
). Есть два хороших решения:
1) (Quickest) Измените тонкую стрелку ->
на жирную стрелку =>
, которая связывает функцию с текущим контекстом, гарантируя, что this
в функции имеет то же значение как this
вне его. Тогда ваш код будет
$('.foo').live 'click', ->
setTimeout (=> $(this).parent().hide()), 5000
2) (наиболее эффективный) Просто запишите значение либо this
, либо $(this)
вне функции, которую вы передаете setTimeout
. Это имеет меньше накладных расходов, чем привязка функции. Тогда ваш код будет
$('.foo').live 'click', ->
$this = $(this)
setTimeout (-> $this.parent().hide()), 5000
Я часто пишу $this = $(this)
в верхней части обратных вызовов. Это очень полезная идиома, которая избавит вас от многих головных болей и обеспечит бесперебойную работу.