分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

JS之经典for循环闭包问题解决方法

发布时间:2023-09-06 01:52责任编辑:沈小雨关键词:闭包
<!DOCTYPE html>
<html lang="en">
<head>
???<meta charset="UTF-8">
???<title>Title</title>
???<link rel="stylesheet" href="bootstrap.css">

</head>
<body>
???<div class="container">
???<div class="row">
???????<div class="col-md-3">
???????????<hr>
???????????<div class="panel panel-info">
???????????????<div class="panel-heading">
???????????????????<h3 class="panel-title">闭包经典实例</h3>
???????????????????<div>
???????????????????????<div class="panel-body">
???????????????????????????<ul class="list-group">
???????????????????????????????<li class="list-group-item">1</li>
???????????????????????????????<li class="list-group-item">2</li>
???????????????????????????????<li class="list-group-item">3</li>
???????????????????????????????<li class="list-group-item">4</li>
???????????????????????????????<li class="list-group-item">5</li>
???????????????????????????</ul>
???????????????????????</div>
???????????????????</div>
???????????????</div>
???????????</div>
???????</div>
???</div>
???</div>
???<script >
???????var liList=document.getElementsByTagName(‘li‘);

???????for(var i=0;i<liList.length;i++){

???????????liList[i].number=i;
???????????liList[i].onclick=function(){
???????????????alert(this.number)
???????????}

// ???????????(function (i){
// ???????????????liList[i].onclick=function( ){
// ???????????????????alert(‘当前点击第‘+ i+‘个‘);
// ???????????????}
// ???????????})(i)
???????}
???</script>
</body>
</html>


像这样一个代码片段,初学者会理所当然地认为依次点击Li会弹出相应的0、1、2、3、4 ?但实际结果是每次都是4
原因是:每次点击输出i的时候,函数内部没有i,就从外部函数查找,而外部函数的值是每一次循环后的值4,所以每次点击输出的都是4

解决办法一:加一层闭包,i 以函数参数形式传递给内层函数:

 ?????????(function (i){
????????????liList[i].onclick=function( ){
?????????????????alert(‘当前点击第‘+ i+‘个‘);
?????????????}
?????????})(i)

解决办法二:找个属性将i值保存起来,然后弹出这个值

 ???????liList[i].number=i;
???????????liList[i].onclick=function(){
???????????????alert(this.number)
???????????}


JS之经典for循环闭包问题解决方法

原文地址:https://www.cnblogs.com/zhumingyong/p/8994636.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved