<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
li {
background-color: #ccc;
border: 1px solid #000;
cursor: pointer;
}
.current {
background-color: orangered;
}
</style>
</head>
<body>
<ul>
<li class="current"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<script>
/*var allLis = document.getElementsByTagName("li");
for (var i = 0; i < allLis.length; i++) {
allLis[i].onmouseover = function () {
for(var j=0; j<allLis.length; j++){
allLis[j].className = "";
}
this.className = "current";
}
}*/
var allLis = document.getElementsByTagName("li");
var lastOne = 0;
for (var i = 0; i < allLis.length; i++) {
(function (index) {
allLis[index].onmouseover = function () {
// 清除
allLis[lastOne].className = "";
// 设置
this.className = "current";
// 赋值
lastOne = index;
}
})(i);
}
</script>
</body>
</html>
这个是闭包的应用场景之一,因为闭包的函数中的变量生命周期比较长,所以可以被用来排他,两个(),第一个写函数,第二个写要传递的参数,也就是i会传递给index,每执行一次循环,就会产生一个函数,每个函数都是独立的,这里就相当于产生了allLis.length个函数,每个函数都有自己的index,每次执行完,就把自己的index赋值给全局变量lastOne,这样再有新的事件产生的时候只需要清除lastOne所对应的那个就行,比for循环更加的高效!