js常见问题之为什么点击弹出的i总是最后一个
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>for</title>
<style type="text/css">
li{
height:50px;
}
</style>
</head>
<body>
<ol>
<li></li>
<li></li>
</ol>
<script>
var btn = document.getElementsByTagName('li'); for(var i = 0;i<2;i++){
btn[i].onclick = function(){
alert(i+1);
};
} </script>
</body>
</html>
分析:
i = 0时,btn[0].onclick = function(){alert(i+1)}
i = 1时,btn[1].onclick = function(){alert(i+1)}
i = 2时,不满足条件跳出循环.
在执行click的函数的时候,会有一个作用域链,这个作用域链是一个对象列表,这组对象定义了代码作用域中的变量。( 关于变量对象的内容想更详细了解的可以查看变量对象。)当我们alert(i)的时候,会去从内到外的去寻找变量i。这个时候这个函数的作用域链上有两个对象,这时循环已经结束了,i此时的值为2.所以点击任何一个li,弹出的都是2,而不是我们想要的索引值。重点在于弹出的是变量i,变量i,变量i。重要的事情说三遍。
那么问题来了,我们要如何解决这个问题呢。我们需要做的就是在每次给aLi[i]绑定事件的时候,将这个时候i的值保存在内部的作用域中。解决方案如下。
var btn = document.getElementsByTagName('li');
        for(var i = 0;i<4;i++){
            (function(i){
                btn[i].onclick = function(){
                alert(i+1);
            };
        })(i)
        }
i = 0时,
(function(i){
btn[0].onclick = function(){
alert(i+1);
}
})(0)
i = 1时,
(function(i){
btn[1].onclick = function(){
alert(i+1);
}
})(1)
i = 2时,不满足条件跳出循环.
由于多了一层自执行函数的包裹,当我们点击li时,会有三层的作用域,从内带外分别是:click函数内部的变量对象,自执行函数的变量对象和最外层的window对象。查找到第二层的时候,找到了i,自执行函数的i等于传入的参数值,相对应的存下了当时i的值,所以就弹出了相应的索引值。
js常见问题之为什么点击弹出的i总是最后一个的更多相关文章
- 工作当中实际运用(3)——js原生实现鼠标点击弹出div层 在点击隐藏
		
function onmou(){ var divs=document.getElementById('kefuDV');//获取到你要操作的div if (divs.style.display==& ...
 - JS  点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/  相册模块,点击弹出图片,并左右滚动幻灯片
		
1, 点击弹出图片 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
 - js点击弹出div层
		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - 点击弹出 +1放大效果 -- jQuery插件
		
20140110更新: <!doctype html> <html> <head> <meta charset="UTF-8"> & ...
 - jQuery之点击弹出图标环形菜单
		
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
 - jquery---点击弹出层
		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - jQuery点击弹出层,弹出模态框,点击模态框消失
		
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
 - jQuery第二课  点击弹出一个提示框
		
选择器允许您对元素组或单个元素进行操作. jQuery 选择器 在前面的章节中,我们展示了一些有关如何选取 HTML 元素的实例. 关键点是学习 jQuery 选择器是如何准确地选取您希望应用效果的元 ...
 - Javascript实现图片点击弹出
		
一直想给安装一个缩略图点击弹出的插件,但是找了找几乎都是用的php来做的,插件的使用和安装极其繁琐,于是上网查了些demo,自己实现了一个纯js的图片弹出插件. 实现的思路是通过编写hook图片的on ...
 
随机推荐
- Mule ESB学习【转-结合了网络上的一些资源】
			
1.SOA标准之一:SCA架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注J ...
 - noip前打板子 qwq
			
在某咕上打了一晚上的模板 感觉还好... #include<bits/stdc++.h> #define LL long long using namespace std; inline ...
 - 1143. Lowest Common Ancestor (30)
			
The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...
 - ACM学习历程—广东工业大学2016校赛决赛-网络赛F 我是好人4(数论)
			
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=5 这个题目一看就是一道数论题,应该考虑使用容斥原理,这里对lcm进行容斥. ...
 - 使用Visual Studio进行单元测试-Part5
			
本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧: 如何模拟类的静态构造函数 如何测试某方法被调用过 如何测试某方法执行的次数 并行编程测试注意事项 一.如何模拟类的静态构造 ...
 - tx2在自制载板上无法识别usb以及pcie无法读取数据
			
注意使用的系统版本是Jetpack-3.1,其它版本的系统上没有测试过!!! 刷机时替换dtb文件: 将Jetpack刷机包 64_TX2/Linux_for_Tegra_tx2/kernel/dtb ...
 - Vijos:P1098合唱队形
			
描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...
 - RPG游戏地牢设计的29个要点
			
转自:http://www.gameres.com/491660.html Troy 是一名 RPG 开发者,以整理了一些自己开发地下城 RPG 的经验,开发者不妨参考一下: 1.地下城应该有个地方无 ...
 - Weblogic反序列化漏洞(CVE-2017-10271)复现
			
通过POST发送xml数据对WebLogic Server组件的WLS Security子组件造成任意代码执行漏洞 影响版本:10.3.6.0.0,12.1.3.0.0,12.2.1.1.0,12.2 ...
 - linux命令-rpm查询包
			
安装了哪些rpm包呢 [root@wangshaojun Packages]# rpm -qa /////查看全部安装的包 [root@wangshaojun Packages]# rpm -qa l ...