js 闭包传参_JavaScript闭包演示

js 闭包传参_JavaScript闭包演示有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。闭包演示functioninit(){varpAry=document.getElementsByTagName(“p”);for(vari=0;ipAry[i].onclick=function(){alert(i);}}}产品一产品二产品三产品四产品五解决方…

大家好,又见面了,我是你们的朋友全栈君。

有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。

闭包演示

function init() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

pAry[i].onclick = function() {

alert(i);

}

}

}

产品一

产品二

产品三

产品四

产品五

解决方式有两种,

1、将变量 i 保存给在每个段落对象(p)上

function init() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

pAry[i].i = i;

pAry[i].onclick = function() {

alert(this.i);

}

}

}

2、将变量 i 保存在匿名函数自身

function init2() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

(pAry[i].onclick = function() {

alert(arguments.callee.i);

}).i = i;

}

}

再增加3种

3、加一层闭包,i以函数参数形式传递给内层函数

function init3() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

(function(arg){

pAry[i].onclick = function() {

alert(arg);

};

})(i);//调用时参数

}

}

4、加一层闭包,i以局部变量形式传递给内存函数

function init4() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

(function () {

var temp = i;//调用时局部变量

pAry[i].onclick = function() {

alert(temp);

}

})();

}

}

5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

function init5() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

pAry[i].onclick = function(arg) {

return function() {//返回一个函数

alert(arg);

}

}(i);

}

}

又有一种方法

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

function init6() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

pAry[i].onclick = new Function(“alert(” + i + “);”);//new一次就产生一个函数实例

}

}

再增加一种

7、用Function实现,注意与6的区别

function init7() {

var pAry = document.getElementsByTagName(“p”);

for( var i=0; i

pAry[i].onclick = Function(‘alert(‘+i+’)’)

}

}

29

1

分享到:

js 闭包传参_JavaScript闭包演示

js 闭包传参_JavaScript闭包演示

2008-10-07 21:34

浏览 4492

评论

7 楼

chb2java

2010-11-19

早看早受益!

6 楼

xkxmud

2010-08-10

js 闭包传参_JavaScript闭包演示 

js 闭包传参_JavaScript闭包演示

5 楼

CrystalBear

2010-06-08

第一种方法最好,楼主功力很深哦,竟然知道这么多写法

4 楼

CrystalBear

2010-06-08

闭包中的i是外部函数中变量i的一个引用,当init执行结束后i的值为5,所以p的onclick调用闭包时,i的值已经是5,

js 闭包传参_JavaScript闭包演示

3 楼

yin_bp

2010-05-18

js 闭包传参_JavaScript闭包演示 

js 闭包传参_JavaScript闭包演示

2 楼

xiaomimishiye

2010-05-13

lmh2072005 写道

js 闭包传参_JavaScript闭包演示

1 楼

lmh2072005

2010-05-10

js 闭包传参_JavaScript闭包演示

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148369.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【SaaS-Export项目】 – 04 前台AdminLTE介绍与入门使用,AdminLTE汉化版下载,搭建一个AdminLTE入门页面「建议收藏」

    【SaaS-Export项目】 – 04 前台AdminLTE介绍与入门使用,AdminLTE汉化版下载,搭建一个AdminLTE入门页面「建议收藏」AdminLTE介绍,汉化版下载,5分钟快速入门使用

    2022年7月27日
    31
  • tasklist 结束进程_转Tasklist(windows)

    tasklist 结束进程_转Tasklist(windows)目录Tasklist简述1、”Tasklist”命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。类似Linux系统的ps命令2、显示结果由五部分组成:映像名称(进程名)、PID、会话名、会话#、内存使用使用格式tasklist[/s[/u[\][/p]]][{/m|/svc|/v}][/fo{table|list|csv}…

    2025年6月11日
    5
  • MySQL读写分离的三种实现方案

    MySQL读写分离的三种实现方案文章目录MySQL读写分离的三种实现方案一、搭建一个“一主两从”的MySQL集群二、读写分离实现:方案一2.1配置多个数据源2.2使用AbstractRoutingDataSource2.3这个版本的缺点:三、读写分离实现:方案二3.1通过ShardingSphere-jdbc实现读写分离3.2这个版本的缺点:四、读写分离实现:方案三4.1通过ShardingSphere-Proxy实现读写分离一、搭建一个“一主两从”的MySQL集群先搭建一个mysql

    2022年4月8日
    40
  • Java之Java开发工具

    Java之Java开发工具

    2021年7月21日
    60
  • ValidateRequest问题

    ValidateRequest问题1,在出现该错误的页面头部的page中加入ValidateRequest="false",那么该页面的任何一次Post提交都不会再验证提交内容的安全性。如:<%@&#160

    2022年7月2日
    21
  • 计算机定时关机命令,定时关机命令,小编教你怎么使用命令行定时关机

    计算机定时关机命令,定时关机命令,小编教你怎么使用命令行定时关机当我们在操作电脑的时候,有时会有需要定时关机,或者不在电脑前操作是需要过段时间自动关机,但是没有自带的定时关机软件,很多电脑用户又不喜欢安装第三方软件来完成该操作。那么怎么定时关机?下面,小编给大家带来了使用命令行定时关机的图文。有时候,下载一个东西,但是又要关闭电脑睡觉了,但是又想等东东下载好了,才去睡觉,想想如果能定时关机就好了。作为程序员的我,有时候就是作践自己啊,那怎么使用命令行定时关机?…

    2022年5月15日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号