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