我在谷歌的帮助下做了一个关闭功能。该功能可以正常工作。但是,我不确定它是如何工作的。
function ShowQuestion(i) {
console.log(i); // here 1 to 10 are logged immediately.
return function() {
console.log(i); // here the number are only logged when I mouse over on any li.
}
}
setTimeout(function() {
for (i = 0; i < document.getElementById('Previousli').getElementsByTagName('ul')[0].children.length; i++) {
document.getElementById('Previousli').getElementsByTagName('ul')[0].children[i].onmouseover = ShowQuestion(i);
}
}, 10000);
首先,我想知道为什么第一个console.log(i)在10秒超时之后立即记录1到10,但第二个console.log(i)只在我鼠标时记录“索引”在一个李?
答案 0 :(得分:6)
我想知道为什么第一个console.log(i)在10秒超时后立即记录1到10
因为超时回调有一个循环并在循环中调用ShowQuestion
。 ShowQuestion
的第一个语句是console.log
,所以当循环运行时,你会看到所有这些,一个接着一个。
但第二个console.log(i)记录&#34;索引&#34;只有当我鼠标悬停在一个李?
因为ShowQuestion
返回一个函数;循环代码将该函数分配给元素的onmouseover
属性,使其成为mouseover
事件的旧式事件处理程序。由ShowQuestion
创建的函数不会运行,直到/除非该事件发生,并且只要该事件发生就重新运行。
当i
是提供给i
的参数时,以及ShowQuestion
运行处理程序时,您可能想知道该事件处理程序为什么/如何显示mouseover
} event,ShowQuestion
已经返回。答案是函数ShowQuestion
在对ShowQuestion
的特定调用的上下文中创建了一个闭包,包括范围内的参数和变量。因此,来自i
的每次调用的ShowQuestion
的每个副本都会幸存,即使与ShowQuestion
相关的调用已完成。
更多: