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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Coredump(tracedump)

    引言当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中(core文件),这种行为就叫做CoreDump或者叫做‘核心转储’,利用coredump可以帮助我们快速定位程序崩溃位置开启coredump终端输入命令:ulimit-a用来显示对进程的一些限制限制,其中第一行表示了core文件最大的大小限制(单位为blocks)默认是…

    2022年4月12日
  • 【转载】究竟什么才是高精度地图(雷锋网)

    【转载】究竟什么才是高精度地图(雷锋网)原文地址:究竟什么才是高精度地图(一)究竟什么才是高精度地图(二)究竟什么才是高精度地图(三)究竟什么才是高精度地图(一)导语:如果有一张辅助的高精度地图,能否避免特斯拉ModelS的事故?

    2022年8月1日
  • 单片机中P1=0x01什么意思「建议收藏」

    单片机中P1=0x01什么意思「建议收藏」0x01是16进制,转化为二进制:00000001(字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数)P1=0x01,表示P1.7~P.1=0,P1.0=1…

    2022年10月23日
  • 快速排序(java实现)

    快速排序(java实现)高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“61279345108”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放…

    2022年6月29日
  • 如何配置IIS运行 ASPX「建议收藏」

    如何配置IIS运行 ASPX「建议收藏」如何配置IIS运行ASPX最近在做.ASPX搞了好一阵子,才弄懂这个东西,和大家分享……欢迎讨论一、先注册asp.net组件:(asp.NET组件即:.NetFramework)开始->运行->cmd->执行命令:C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe-i(你的.net组件…

    2022年11月1日
  • vs2010 序列号「建议收藏」

    vs2010 序列号「建议收藏」序列号:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP从网上搜的,经测试,可用信息来源:http://blog.163.com/ldy_3881685/blog/static/32380136201031333921823/示意图环境windows7旗舰中文+vs2010旗舰英文,vs2010自己从官网下载试用版本,然后输入序列号的步骤同vs200…

    2022年7月20日

发表回复

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

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