Javascript 带有setTimeout&;的变量范围;清除超时

Javascript 带有setTimeout&;的变量范围;清除超时,javascript,jquery,variables,scope,Javascript,Jquery,Variables,Scope,在研究变量作用域时,有一件事我似乎弄不明白。例如,两个元素。如果第一个悬停在其上,则会显示其同级。如果将鼠标移出初始元素,则兄弟元素将通过存储在变量表达式中的setTimeout消失。如果您碰巧将鼠标悬停在兄弟节点上,则会调用clearTimeout函数,并将其设置为在回调中淡出 关于作用域,我不理解的是timer变量在clearTimeout函数中是如何被识别的。我试图console.log(timer),但只得到了数值。虽然下面的工作,我想知道为什么和如何?换句话说,第二个hover方法调用

在研究变量作用域时,有一件事我似乎弄不明白。例如,两个元素。如果第一个悬停在其上,则会显示其同级。如果将鼠标移出初始元素,则兄弟元素将通过存储在变量表达式中的setTimeout消失。如果您碰巧将鼠标悬停在兄弟节点上,则会调用clearTimeout函数,并将其设置为在回调中淡出

关于作用域,我不理解的是
timer
变量在
clearTimeout
函数中是如何被识别的。我试图
console.log(timer)
,但只得到了数值。虽然下面的工作,我想知道为什么和如何?换句话说,第二个hover方法调用如何知道计时器变量内部的内容,因为它超出了范围

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);
});

简单。。计时器本身通过“timer”变量存储在内存中,您在与同级事件绑定相同的范围内定义了该变量。因此,可以通过在任何兄弟或子作用域中直接使用“timer”调用timer变量来访问它。您是否在函数中声明了“var timer”部分,如下所示:

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

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

函数
clearTimeout
不仅需要
setTimeout
,还需要它的ID。我在下面找到了它:

因此,当您设置超时时,它返回一个特定的ID供参考,因此
clearTimeout
将起作用。同样,根据:

由于您在全局作用域上设置了
计时器
,因此您的每个函数都可以访问它。


谢谢你问了我一个问题,让我学到了一些东西!(我不知道
setTimeout
返回了什么)

您得到了数值,因为它就是这样工作的
setTimeout
返回标识超时的数字。非常感谢您清除该部分。但是,同级的
hover
方法中如何准确识别
timer
变量?是的,这就是为什么您不想在深度嵌套的函数中执行var timeoutID=的原因,因为除非在与clearTimeout处理相同的范围内的函数中声明该ID,否则您永远无法检索该ID的实际内容(或使用外部存储器)谢谢!从某种意义上说,
timeoutID
是隐藏的,并由
clearTimeout
函数在后台检索?没问题,Carl!timeoutID由您保存在
timer
变量的全局作用域中,这意味着所有内容都可以访问它。有关作用域及其在JS中的工作方式的更多信息,请阅读。非常感谢信息太多了!