将$(this)传递给设置超时功能?

fan*_*ncy 1 javascript jquery coffeescript

就像是...

 $('.foo').live 'click', -> 
    setTimeout (()->$(this).parent().hide()), 5000
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Tre*_*ham 5

James已正确诊断出问题:当你传递一个函数时setTimeout,它会在window上下文中调用(就像你调用的func那样func()).有两个很好的解决方案:

1)(最快)将细箭头更改为->胖箭头=>,将功能绑定到当前上下文,确保this函数内部具有与其this外部相同的值.然后你的代码就是

$('.foo').live 'click', -> 
  setTimeout (=> $(this).parent().hide()), 5000
Run Code Online (Sandbox Code Playgroud)

2)(效率最高)只需捕获您传递给的函数之一this$(this)之外的值setTimeout.这比绑定函数的开销少.然后你的代码就是

$('.foo').live 'click', -> 
  $this = $(this)
  setTimeout (-> $this.parent().hide()), 5000
Run Code Online (Sandbox Code Playgroud)

$this = $(this)经常发现自己在回调的顶端写作.这是一个非常有用的成语,可以在确保顺畅的性能的同时为您节省很多麻烦.