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);
};