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


相关推荐

  • 让AllocateHwnd接受一般函数地址作参数

    让AllocateHwnd接受一般函数地址作参数http://www.xuebuyuan.com/1889769.htmlClasses单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型:functionAllo

    2022年7月3日
    27
  • asp:ScriptManager

    asp:ScriptManager概述ScriptManager控件管理用于MicrosoftASP.NETAJAX页面的客户端脚本。默认情况下,ScriptManager控件将MicrosoftAJAX库的脚本与页面注册到一起,这使脚本可以使用类型系统扩展并支持局部页面输出和Web服务调用。在页面中,必须使用ScriptManager控件来使下列MicrosoftASP.NETAJAX的特性可用…

    2022年7月13日
    22
  • java中的四舍五入——几种四舍五入的写法

    java中的四舍五入——几种四舍五入的写法//方式一:BigDecimal方式doublef=3.1315;BigDecimalb=newBigDecimal(newDouble(f).toString);doublef1=b.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue();注意:这里一定不要直接使用newBigDecimal(double)

    2022年7月9日
    20
  • JavaScript中splice方法的使用「建议收藏」

    JavaScript中splice方法的使用「建议收藏」JavaScript中splice方法的使用splice的基本用法删除操作插入操作替换操作splice一次性删除多个元素splice的基本用法在JavaScript中,arrObject.splice()方法是处理数组的利器,利用它可以实现在指定位置删除、替换、插入指定数量的元素。其语法为:arrayObject.splice(index,howmany,item1,…,itemX)含义为从index开始,删除howmanry个元素,并在原地插入item1,…,itemN,最后返回被删除的数组

    2022年9月13日
    2
  • matlab画点图如何设置点的大小颜色_matlab如何根据点绘制曲线图

    matlab画点图如何设置点的大小颜色_matlab如何根据点绘制曲线图线型 说明 标记符 说明 颜色 说明 – 实线(默认) + 加号符 r 红色 — 双划线 …

    2022年9月20日
    4
  • nacos和eureka注册中心对比 and CAP定律理解

    1.CP和AP不可能同时满足2.P代表分区容错,在整个分布式系统中某个节点服务挂掉了,并不影响整个系统的运作和使用,因为他可以在稍后或者通过切换可用节点立即恢复使用3.C:写操作之后的读操作,必须返回该值。注册中心集群中:leader的作用,所有的写操作都依赖于leader来完成,为了保证数…

    2022年4月6日
    129

发表回复

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

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