下面小编就为大家带来一篇浅谈 JavaScript for 循环 闭包。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
有个网友问了个问题,如下的 html,为什么每次输出都是 5,而不是点击每个 p,就 alert 出对应的 1,2,3,4,5。
- <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)上
- 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 保存在匿名函数自身
- 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、加一层闭包,i 以函数参数形式传递给内层函数
- 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 以局部变量形式传递给内存函数
- 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 的细微区别)
- 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 实现,实际上每产生一个函数实例就会产生一个闭包
- 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 的区别
- function init7() {
- var pAry = document.getElementsByTagName("p");
- for( var i=0; i<pAry.length; i++ ) {
- pAry[i].onclick = Function('alert('+i+')')
- }
- }
来源: http://www.phperz.com/article/17/0303/264667.html