为什么setTimeout在我的代码中不起作用?我需要可行的代码)

时间:2014-09-26 23:24:15

标签: javascript jquery

我不知道为什么我的代码不起作用。请帮忙!

$('nav').mouseout(setTimeout(function() {
    $(this).removeClass('subm')
}, 1000));

没有setTimeout是正常的工作。

2 个答案:

答案 0 :(得分:2)

立即调用

setTimeout(...)。它返回新挂起超时的id号。超时仅在此处注册并调用一次。你的代码执行就像这样:

setTimeout(function() {
  $(this).removeClass('subm')
}, 1000);
// = 2

$('nav').mouseout(2);

你需要传递.mouseout()一个每次调用setTimeout的函数。您还需要修复this引用,该引用在setTimeout回调中是不同的。这应该解决这两个问题:

$('nav').mouseout(function() {
  var self = this;
  setTimeout(function() {
    $(self).removeClass('subm')
  }, 1000);
});

答案 1 :(得分:2)

在javascript中,与大多数其他语言一样,当你这样做时:

variable = some_function();

您将函数的返回值传递给变量。同样,当你这样做时:

a_function(another_function());

您将另一个函数的返回值作为参数传递给函数。

这在javascript,C,PHP,Ruby甚至Fortran中都是一样的。

所以,当你这样做时:

$('nav').mouseout(setTimeout(..));

您将setTimeout的返回值作为参数传递给mouseoutsetTimeout会返回一个可以在clearTimeout中使用的数字。所以你基本上是这样做的:

$('nav').mouseout(a_number);

你想要的是传递一个函数:

$('nav').mouseout(function(){setTimeout(..)});

或者,如果您发现难以阅读,请执行此操作:

function handleMouseOut () {
    setTimeout(...);
}
$('nav').mouseout(handleMouseOut); // note we're passing a function here
                                   // not calling it