Javascript 试图理解闭包函数
我在谷歌的帮助下做了一个闭包函数。该函数正常工作。然而,我不知道它是如何工作的Javascript 试图理解闭包函数,javascript,function,closures,Javascript,Function,Closures,我在谷歌的帮助下做了一个闭包函数。该函数正常工作。然而,我不知道它是如何工作的 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(f
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);//这里立即记录1到10。
返回函数(){
console.log(i);//这里,只有当我将鼠标移到任何li上时,才会记录号码。
}
}
setTimeout(函数(){
对于(i=0;i
首先,我想知道为什么第一个console.log(I)在10秒超时后立即记录1到10,而第二个console.log(I)只在我将鼠标移到li上时记录“索引”
我想知道为什么第一个console.log(I)在10秒超时后立即记录1到10
因为超时回调有一个循环,并在循环中调用ShowQuestion
。ShowQuestion
的第一条语句是console.log
,因此当循环运行时,您可以看到所有这些语句,一个接一个
但是第二个console.log(i)仅当我将鼠标移到li上时才记录“索引”
因为ShowQuestion
返回一个函数;循环代码将该函数分配给元素的onmouseover
属性,使其成为mouseover
事件的老式事件处理程序。由ShowQuestion
创建的函数直到/除非该事件发生才运行,并且在该事件发生时重新运行
您可能想知道当i
是提供给ShowQuestion
的一个参数,并且当mouseover
事件运行该处理程序时,ShowQuestion
已经返回,该事件处理程序为什么/如何显示i
。答案是,ShowQuestion
函数创建的是对ShowQuestion
的特定调用上下文的闭包,包括范围内的参数和变量。因此,对ShowQuestion
的每次调用中的i
的每个副本都存在,即使与之相关的ShowQuestion
调用已完成
更多:
- 以下是:
- 在我贫血的小博客上: