JavaScript 闭包 for循环
来源:互联网 发布:alien skin mac 编辑:程序博客网 时间:2024/06/05 11:42
有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。
[html] view plaincopyprint?
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>闭包演示</title>
<script type="text/javascript">
function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function() {
alert(i);
}
}
}
</script>
</head>
<body onload="init();">
<p>产品一</p>
<p>产品二</p>
<p>产品三</p>
<p>产品四</p>
<p>产品五</p>
</body>
</html>
解决方式有两种,
1、将变量 i 保存给在每个段落对象(p)上
[javascript] view plaincopyprint?
function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].i = i;
pAry[i].onclick = function() {
alert(this.i);
}
}
}
2、将变量 i 保存在匿名函数自身
[javascript] view plaincopyprint?
function init2() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(pAry[i].onclick = function() {
alert(arguments.callee.i);
}).i = i;
}
}
再增加3种
3、加一层闭包,i以函数参数形式传递给内层函数
[javascript] view plaincopyprint?
function init3() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(function(arg){
pAry[i].onclick = function() {
alert(arg);
};
})(i);//调用时参数
}
}
4、加一层闭包,i以局部变量形式传递给内存函数
[javascript] view plaincopyprint?
function init4() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
(function () {
var temp = i;//调用时局部变量
pAry[i].onclick = function() {
alert(temp);
}
})();
}
}
5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)
[javascript] view plaincopyprint?
function init5() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function(arg) {
return function() {//返回一个函数
alert(arg);
}
}(i);
}
}
又有一种方法
6、用Function实现,实际上每产生一个函数实例就会产生一个闭包
[javascript] view plaincopyprint?
function init6() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例
}
}
再增加一种
7、用Function实现,注意与6的区别
[javascript] view plaincopyprint?
function init7() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = Function('alert('+i+')')
}
}
- JavaScript 闭包 for循环
- JavaScript闭包 取for循环i
- JavaScript--------闭包 取for循环i
- JavaScript闭包 取for循环i 【转】
- JavaScript闭包导致的for循环问题解决 【转】
- 解决javascript for 循环使用闭包的问题
- for循环 i 闭包
- 闭包与for循环
- for循环的闭包
- for循环的闭包
- for循环与闭包
- javascript循环与闭包
- JavaScript闭包中的循环
- for循环时jquery闭包问题
- for循环时jquery闭包问题
- js for循环中的闭包
- js for循环中的闭包
- for循环绑定事件与闭包
- 从零开始学习OpenGL ES之二 – 简单绘图概述
- 基于 Apache 在本地配置多个虚拟主机
- c/c++/mfc/Linux c 关于文件的操作
- java.util.ConcurrentModificationException
- Mplayer安装教程(fedora9环境下)
- JavaScript 闭包 for循环
- 前端开发日记一:网页定位两三事
- POJ3468 A Simple Problem with Integers
- C++11使用lambda操作std::map
- 怎么找回清空的回收站删除文件呢
- sql语句 in和exists的区别
- ubuntu 13.04 搭建spcaview
- 开始写博客
- 实现session监听器