在研究变量范围时,有一件事我似乎无法弄清楚。例如两个元素。如果第一个被徘徊,那么它的兄弟会出现。如果您将鼠标移出初始元素,则兄弟将通过存储在变量表达式中的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);
});
答案 0 :(得分:1)
函数clearTimeout
不仅包含setTimeout
,还包含其ID。这是我在MDN上找到的内容:
因此,当您设置超时时,它会返回一个特定ID以供参考,因此clearTimeout
将起作用。同样,每MDN:
由于您在全局范围内设置了timer
,因此您的每个功能都可以访问它。
感谢您提出一个教我一些问题的问题! (我不知道setTimeout
返回任何内容)
答案 1 :(得分:0)
简单..定时器本身通过'定时器存储在内存中。您在与兄弟事件绑定相同的范围内定义的变量。因此,定时器变量可通过直接用'定时器'来调用。在任何兄弟或儿童范围内。如果你宣布了' var计时器'在这个函数中的一部分:
function() {
var timer;
timer = setTimeout(function() {
$('p:eq(1)').fadeOut();
}, 1000);
结果是clearTimeout(计时器)不在范围内并导致未知成员错误。