87,937
社区成员
发帖
与我相关
我的任务
分享
(1)闭包有一个重要的特性就是:在引用外部函数的变量时,取外部函数变量的最终值。
在你的例子中,onclick函数就是一个闭包,它的外部函数就是onload函数,当你真正去点击input的时候,onclick函数才执行并引用onload函数中的变量i,但是此时onload函数已经执行完毕,i的最终值已经变成(inputs.length - 1),所以根据上述闭包特性,不管你点击哪个input,onclick函数引用的i的值都是(inputs.length - 1)。
(2)一般情况,都是利用匿名函数来解决的,即:每for一次,便立即将当前的i值赋给相应的input的onclick函数。如下:
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
alert(inputs.length);
for (var i = 2; i < inputs.length - 1; i++)
{
(function(n){
inputs[n].onclick = function () {
f1(inputs[n]);
}
})(i);
}
}
这样,当onclick函数再执行的时候,它引用的就已经不是onload函数中的i了,而是匿名函数中的n,而每for一次,便有一个匿名函数立即用i传参并执行,所以每个匿名函数中的n都是不一样的,都对应着当前的i。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<input type="button" name="btn1" value="btn1" />
<input type="button" name="btn2" value="btn2" />
<input type="button" name="btn3" value="btn3" />
<input type="button" name="btn4" value="btn4" />
<input type="button" name="btn5" value="btn5" />
<input type="button" name="btn6" value="btn6" />
<script type="text/javascript">
window.onload = function myfunction() {
inputs = document.getElementsByTagName("input");
for (var i = 0; i < inputs.length; i++){
inputs[i].onclick = function () {
f1(this);
}
}
}
function f1(ele){
alert(ele.getAttribute('name'));
}
</script>
</body>
</html>