Javascript闭包-鼠标事件

Javascript闭包-鼠标事件,javascript,Javascript,我有以下代码: var as = document.getElementsByTagName('a'); for ( var i = as.length; i--; ) { as[i].onclick = function(num) { return function() { console.log(num); }; }(i); } 它可以按预期工作,但当我向返回函数添加num时,如下所示。它打印出鼠标事件。为什么

我有以下代码:

var as = document.getElementsByTagName('a');

     for ( var i = as.length; i--; ) {

    as[i].onclick = function(num) {

        return function() {
          console.log(num);
    }; 

    }(i);
}
它可以按预期工作,但当我向返回函数添加num时,如下所示。它打印出鼠标事件。为什么?


您正在向onclick事件返回一个函数。该函数是在触发事件时调用的函数

当JavaScript调用事件函数时,它会将事件对象传递给它

当您将num添加到您所说的//在此处添加num导致问题的位置时,您正在创建一个新的局部num变量,它将外部num变量的值i隐藏起来


您正在向onclick事件返回一个函数。该函数是在触发事件时调用的函数

当JavaScript调用事件函数时,它会将事件对象传递给它

当您将num添加到您所说的//在此处添加num导致问题的位置时,您正在创建一个新的局部num变量,它将外部num变量的值i隐藏起来


因为您基本上是在分配以下内容:

function(num) {
    console.log(num);
}; 

单击每个单击事件。但是当一个函数被分配给一个事件时,该函数接受的第一个参数将由对应于该事件的事件对象填充。因此,当浏览器查找console.lognum的num时;它从最里面的作用域开始,即指定为事件处理程序的函数的作用域,并发现num指向click事件的事件对象,因此这就是控制台显示的内容。

因为您基本上是在分配以下内容:

function(num) {
    console.log(num);
}; 

单击每个单击事件。但是当一个函数被分配给一个事件时,该函数接受的第一个参数将由对应于该事件的事件对象填充。因此,当浏览器查找console.lognum的num时;它从最里面的作用域开始,即指定为事件处理程序的函数的作用域,并发现num指向click事件的事件对象,因此这就是控制台显示的内容。

因为事件发生时会传递给事件处理程序。请参阅:。因为事件发生时会传递给事件处理程序。见:。@Bergi:谢谢。我尽力解释它。阴影是个更好的词-@伯吉:谢谢。我尽力解释它。阴影是个更好的词-
function(num) {
    console.log(num);
};