JavaScript中几种常用的解决for循环中引用同一循环变量对象的方法
2017-07-11 19:51
603 查看
JavaScript中几种常用的解决for循环中引用同一循环变量对象的方法
示例代码前提:HTML代码默认如下<body> <button>0</button> <button>1</button> <button>2</button> <button>3</button> <button>4</button> <button>5</button> </body>
在日常编写JS代码时,我们经常会遇到类似于下面这种情况:
想让每个按钮被点击时,引用被点击的那个按钮的索引,类似于如下情况
<script type="text/javascript"> var btns = document.getElementsByTagName('button'); for(var i=0;i<btns.length;i++){ btns[i].onclick = function(){ alert(i); //结果每次弹出框中的i值都为6 }; </script>
出现上述情况是因为JS中没有块级作用域,for循环中的循环变量 i 是在全局作用域中,点击函数中指向的又是同一变量 i ,而这个 i 在最后一次循环后值被改变为6。
最近无意中发现几种比较常用的解决方法:
方法一:在for循环外部创建独立的函数作用域,将循环变量值传过去:
for (var i = 0; i < 3; i++) {
bindEvent(i); //每循环一次就传一次i
};
function bindEvent(n) {
btns
.onclick = function () {
alert(n);
};
方法二:在点击函数前存储循环变量 i 的值:
for(var i=0;i<btns.length;i++){
btns[i].index = i;
btns[i].onclick = function(){
alert(this.index);
};
}
方法三:用闭包方法解决(私有作用域):
for(var i=0;i<btns.length;i++){
(function(j){
btns[j].onclick = function(){
alert(j);
};
})(i);
}
方法四:用ECMA新增let关键词代替var :
let关键字,将变量绑定在声明它的作用域中(即块级作用域)。
for(let i=0;i<btns.length;i++){
btns[i].onclick = function(){
alert(i);
};
}
相关文章推荐
- Javascript创建对象的几种常用方法
- JavaScript的闭包问题(闭包解决引用循环变量的问题)
- 用JAXB转换XML和Java对象时的循环引用问题的解决方法
- JavaScript中的String对象的常用方法、文本框对象的常用方法和事件、正则表达式的概念、正则表达式的几种构造方式、RegExp对象使用什么方法匹配正则表达式、
- 【Smarty】Smarty引用、常用内置变量、判断、循环、JavaScript脚本
- JavaScript --Array 对象常用方法
- JavaScript中定义类及对象的几种方法
- linux下配置jdk环境变量的几种常用方法
- Javascript中的Math对象常用方法
- 几类javascript常用的创建对象方法
- Error #1009: 无法访问空对象引用的属性或方法 --问过的个问题 解决了 记录下
- Request.QueryString["**"]发生“未将对象引用设置到对象的实例。”的解决方法
- 浅谈JavaScript中的String对象常用方法
- JAVA对象转为Java String的几种常用方法
- JavaScript Array+String对象的常用方法
- NSTimer保留目标对象引起循环引用造成内存泄漏解决办法
- 引用 Javascript刷新页面的几种方法
- Dynamics CRM 安装CRM程序系统检查界面报未将对象引用设置到对象的实例的解决方法
- TypeError: Error #1009: 无法访问空对象引用的属性或方法。(解决)
- 金蝶KIS10专业版客户端打开'91'错误:未设置对象变量或 With block 变量的解决方法