setTimeout没有使用匿名函数延迟

时间:2010-11-04 22:45:56

标签: jquery parameter-passing settimeout anonymous-function

我正在为使用jQuery编写的项目构建自定义幻灯片。每个幻灯片都有4个事件绑定(播放,停止,下一个,上一个)。控件出现在鼠标悬停和mouseout上。在mouseout上我希望控件的延迟消失。为此,我使用了setTimeout。

$(this).attr('timeout', setTimeout((function(obj){obj.fadeOut(250);})($(this)), 1000));

然而,这会导致'无用的setTimeout调用(缺少参数周围的引号?)'错误

我删除了($(this))以查看是否可以简化操作。

$(this).attr('timeout', setTimeout((function(foo){alert(foo);})('bar'), 1000));

这导致'bar'在mouseout上的警告消息框中显示,没有延迟,或者在firebug中报告任何错误。我只能通过这个逻辑假设匿名函数正在立即运行,这为setTimeout稍后调用没有任何东西。

如果我忽略了将$(this)传递给匿名函数并尝试

的需要
$(this).attr('timeout', setTimeout(function(){alert('foo');}, 1000));

一切都按预期工作,我必须对匿名函数的语法做错了,但我不知道它可能是什么。

由于

1 个答案:

答案 0 :(得分:2)

由于您使用的是jQuery,只需使用$.proxy()设置调用contenxt,如下所示:

$(this).attr('timeout', 
  setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));

请注意,虽然这不是一个有效的属性,但最好将此类内容存储在.data()中,如下所示:

$(this).data('timeout', 
  setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));

或者这个:

$.data(this, setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000));

您当前方法的问题在于这是自我调用:

(function(foo){alert(foo);})('bar')

您希望返回具有正确上下文的函数...在您的情况下使用上面的$.proxy()更简洁地完成。