Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 试图理解闭包函数_Javascript_Function_Closures - Fatal编程技术网

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
调用已完成

更多:

  • 以下是:
  • 在我贫血的小博客上:

啊,我的眼睛现在睁开了。谢谢你,先生!基本上,ShowQuestion函数在超时后运行10次,然后再也不会运行了?循环是否创建了10个不同的鼠标悬停事件,每个li元素一个?@IssacNolan:就是这样。:-)