function()内会改变作用域
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>变量、作用域</title>
<style type="text/css">
button{
display:inline-block;
background:#3cb371;;
width:40px;
height:25px;
border:1px solid red;
border-radius:5px;
margin:0 0 0 5px;
}
</style>
</head>
<body>
<button id="0">btn1</button>
<button id="1">btn2</button>
<button id="2">btn3</button>
<script type="text/javascript">
//要想弹出0,1,2;
var btns=document.getElementsByTagName("button");
for(var i=0;i<btns.length;i++)
{
btns[i].onclick=function(){
i=this.id;
alert(i);
}
}
</script>
</body>
</html>
正在回答
你想问的是什么?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>变量、作用域</title>
</head>
<body>
<button>btn1</button>
<button>btn2</button>
<button>btn3</button>
<script type="text/javascript">
//要想弹出0,1,2;
var btns=document.getElementsByTagName("button");
for(var i=0;i<btns.length;i++){
(function(a){
btns[a].onclick=function(){
alert(a);
};
})(i);
}
</script>
</body>
</html>
这样写,你应该更容易理解。你首先要了解闭包,了解函数的参数,了解自执行。
那么一个新的问题,这里为什么要用到闭包,并且自执行?
因为闭包可以开辟一个新的空间来储存数据。自执行可以保存传递循环的值。
这样做就可以把for循环的i的值给保存在闭包里。
我们在自执行调用的那个括号里给了一个实参i,这个i就是for循环的i,每一次循环,它都会被传递进了函数中,函数中有个形参a去接收,a的值就等于i的值。函数中的内容大家都能看懂,这里就不解释了。
说的再直白些,我们把for循环中的自执行闭包就看做for循环中有个console.log(i);
每一次循环,控制台是不是都会输出i的值。
前面的(function(...){...})这个闭包就等同于console.log。后面的(i)就刚好等同于(i)。
那么是不是每一次循环i都会改变,(i)在闭包后面就是调用函数,往里面传个参数i,那么0,1,2是不是就被传进闭包中去了? 然后闭包中的a是不是刚好接收了这个i的0,1,2。
给你们展示一个不用循环的无聊方法。。。。
全局i和局部i。。。。
<script type="text/javascript">
//要想弹出1,2,3;
var btns=document.getElementsByTagName("button");
var i = 0;
btns[i].onclick = function num(){
var i = 0;
alert(i+1);
i++;
btns[i].onclick = function(){
alert(i+1);
i++;
btns[i].onclick = function(){
alert(i+1);
}
}
}
</script>
使用匿名函数也可以的
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>变量、作用域</title>
<style type="text/css">
button{
display:inline-block;
background:#3cb371;;
width:40px;
height:25px;
border:1px solid red;
border-radius:5px;
margin:0 0 0 5px;
}
</style>
</head>
<body>
<button>btn1</button>
<button>btn2</button>
<button>btn3</button>
<script type="text/javascript">
//要想弹出0,1,2;
var btns=document.getElementsByTagName("button");
for(var i=0;i<btns.length;i++)
{
(function(i){
btns[i].onclick=function(){
alert(i);
}
})(i)
}
</script>
</body>
</html>
- 参与学习 466 人
- 提交作业 74 份
- 解答问题 635 个
JavaScript不仅能实现静态页面到动态特效的转变,还能完成数据的动态交互,但是关于js到底功能有多强大,大家还是有所期待的,本路径将带你深入到js中,一一揭开JavaScript的神秘面纱。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星