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


相关推荐

  • visio2010密钥

    visio2010密钥GR24B-GC2XY-KRXRG-2TRJJ-4X7DCVWQ6G-37WBG-J7DJP-CY66Y-V278X2T8H8-JPW3D-CJGRK-3HTVF-VWD83HMCVF-BX8YB-JK46P-DP3KJ-9DRB222WT8-GGT7M-7MVKR-HF7Y4-MCWWDVX6BF-BHVDV-MHQ4R-KH9QD-6TQKVJ4MVP-7F4X4-V8W2C-…

    2022年5月29日
    605
  • C语言入门项目篇:贪吃蛇(完整代码+详细注释)「建议收藏」

    C语言入门项目篇:贪吃蛇可直接运行。#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>/*大一上的时候C语言入门学的一个小游戏。还是挺有意思的,有兴趣的同学可以继续优化下:比如蛇头碰到蛇身就判定为输/给蛇身加点颜色等。*///1.2食物结构体#defineMAPHEIGHT25#defi

    2022年4月4日
    118
  • 功能测试框架

    功能测试框架测试用例的编写需要按照一定的思路进行,而不是想到哪写到哪,一般测试机制成熟的公司都会有公司自己自定义的测试用例模板,以及一整套的测试流程关注点,当然我们自己在测试生涯中也应当积累一套自己的测试框架,所有功能性的测试都可以依据框架的思路来进行,达到事半功倍的效果。功能测试框架可以包括:界面友好性测试、功能测试、链接测试、容错测试、稳定性测试、常规性能测试、配置测试、算法测试等等。1.1.1界面友好性测试1.风格、样式、颜色是否协调2.界面布局是否整齐、协调(保证全部显示出来的,尽量…

    2022年7月13日
    23
  • Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)

    Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)

    2021年11月22日
    43
  • python机器视觉opencv_opencv轻松入门:面向python电子版

    python机器视觉opencv_opencv轻松入门:面向python电子版以下是快速学完OpenCV+python计算机视觉图像处理的个人总结。任何知识或者学科都不可能快速学会,一口吃不成大胖子,想要学会,只能一点一点积累。不积跬步无以至千里,不敲千遍无可能懂理。想要学会,不能光看,须知熟才能生巧,一定要多敲!一定要多敲!一定要多敲!视频链接请点击这里代码连接请点击这里,提取码:iukw看完视频一定要手动敲,不然最后只是眼睛会了,脑子和手却不会。以下是Windows、Linux、Mac深度学习环境搭建详细教程:1、windows搭建深度学习环境详细教程2、L

    2025年8月28日
    7
  • navicat 15 for激活码[在线序列号]

    navicat 15 for激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    71

发表回复

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

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