变量范围与setTimeout& clearTimeout

时间:2014-12-26 04:12:04

标签: javascript jquery variables scope

在研究变量范围时,有一件事我似乎无法弄清楚。例如两个元素。如果第一个被徘徊,那么它的兄弟会出现。如果您将鼠标移出初始元素,则兄弟将通过存储在变量表达式中的setTimeout消失。如果你碰巧悬停在兄弟姐妹上,则会调用clearTimeout函数并将其设置为在回调中淡出。

关于范围,我不理解timer函数在clearTimeout函数中的确切程度。我尝试console.log(timer),但只是得到了数值。虽然以下工作我想知道为什么以及如何?换句话说,第二个悬停方法调用如何知道计时器变量中的内容,因为它超出了范围?

var timer;

$('p:eq(1)').hide();

$('p').first().hover(function() {
  $(this).next().fadeIn();
}, function() {
  timer = setTimeout(function() {
    $('p:eq(1)').fadeOut();
  }, 1000);
  // console.log(timer);
});

$('p:eq(1)').hover(function() {
  clearTimeout(timer);
}, function() {
  $('p:eq(1)').fadeOut(1000);
});

2 个答案:

答案 0 :(得分:1)

函数clearTimeout不仅包含setTimeout,还包含其ID。这是我在MDN上找到的内容: enter image description here

因此,当您设置超时时,它会返回一个特定ID以供参考,因此clearTimeout将起作用。同样,每MDNenter image description here

由于您在全局范围内设置了timer,因此您的每个功能都可以访问它。

感谢您提出一个教我一些问题的问题! (我不知道setTimeout返回任何内容)

答案 1 :(得分:0)

简单..定时器本身通过'定时器存储在内存中。您在与兄弟事件绑定相同的范围内定义的变量。因此,定时器变量可通过直接用'定时器'来调用。在任何兄弟或儿童范围内。如果你宣布了' var计时器'在这个函数中的一部分:

 function() {
  var timer;
  timer = setTimeout(function() {
    $('p:eq(1)').fadeOut();
  }, 1000);

结果是clearTimeout(计时器)不在范围内并导致未知成员错误。