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

时间:2011-07-08 05:57:15

标签: javascript jquery coffeescript

像...一样的东西。

 $('.foo').live 'click', -> 
    setTimeout (()->$(this).parent().hide()), 5000

感谢您的帮助!

4 个答案:

答案 0 :(得分:5)

James已正确诊断出问题:当您将某个功能传递给setTimeout时,会在window上下文中调用该功能(就像您将func称为func()一样) 。有两个很好的解决方案:

1)(最快)将细箭头->更改为胖箭头=>,将功能绑定到当前上下文,确保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)。这是一个非常有用的习惯用语,可以在确保顺畅的表现的同时为您节省很多麻烦。

答案 1 :(得分:3)

这在setTimeout中将是window或未定义。在这种情况下,你最好用一个匿名函数包装来关闭它,或者使用bind(this)来绑定函数的这个对象

setTimeout((function() { return function() { $(this).parent().hide(); } })(), 5000);

var func = function() { $(this).parent().hide(); };
setTimeout(func.bind(this), 5000);

(我不太了解coffeescript,所以希望这是正确的JS等价物)

作为旁注,jquery不具备延迟这样的动画的功能吗?

答案 2 :(得分:1)

CoffeeScript有'do'关键字,“立即调用传递的函数”。它应该有帮助。

$('.foo').live 'click', -> 
  foo = $(this)
  do foo ->
    setTimeout (()->foo.parent().hide()), 5000

答案 3 :(得分:-1)

$(this)作用于功能。因此,$(this)此处未指定$('.foo')个对象。首先必须将该对象缓存在某个变量中,然后将该变量传递给setTimeout函数。

类似的东西:

 var foo = $('.foo');
 setTimeout(foot.parent().hide(), 5000);