闭包允许内层函数引用父函数中的变量,但是该变量是最终值
2014-09-11 21:11
375 查看
今天在学习JavaScript的时候碰到的一个类似于如下代码的问题:
在函数执行时,会发现弹窗显示的值总是4(即:父函数中的循环变量i的最终值),而不是我们期望的0,1,2,3.原因是:当mouseover事件调用监听函数时,首先在匿名函数( function(){ alert(i); })内部查找是否定义了 i,结果是没有定义;因此它会向上查找,查找结果是已经定义了,并且i的值是4(循环后的i值);所以,最终每次弹出的都是4。
可能的解决办法如下[1]:
以上方法中,method 1 亲自测试可用,且推荐使用该方法。
Reference
[1] JavaScript中的匿名函数及函数的闭包 /article/4850938.html
/** * <body> * <ul> * <li>one</li> * <li>two</li> * <li>three</li> * <li>one</li> * </ul> */ var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ lists[ i ].onmouseover = function(){ alert(i); }; }
在函数执行时,会发现弹窗显示的值总是4(即:父函数中的循环变量i的最终值),而不是我们期望的0,1,2,3.原因是:当mouseover事件调用监听函数时,首先在匿名函数( function(){ alert(i); })内部查找是否定义了 i,结果是没有定义;因此它会向上查找,查找结果是已经定义了,并且i的值是4(循环后的i值);所以,最终每次弹出的都是4。
可能的解决办法如下[1]:
//method 1 var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ (function(index){ lists[ index ].onmouseover = function(){ alert(index); }; })(i); }
//method 2 var lists = document.getElementsByTagName('li'); for(var i = 0, len = lists.length; i < len; i++){ lists[ i ].$$index = i; //通过在Dom元素上绑定$$index属性记录下标 lists[ i ].onmouseover = function(){ alert(this.$$index); }; }
//method 3 function eventListener(list, index){ list.onmouseover = function(){ alert(index); }; } var lists = document.getElementsByTagName('li'); for(var i = 0 , len = lists.length ; i < len ; i++){ eventListener(lists[ i ] , i); }
以上方法中,method 1 亲自测试可用,且推荐使用该方法。
Reference
[1] JavaScript中的匿名函数及函数的闭包 /article/4850938.html
相关文章推荐
- 函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包
- PHP中函数内引用全局变量的方法
- php的引用(就是在变量或者函数、对象等前面加上&符号)
- js闭包(变量引用函数内部函数)
- js闭包(变量引用函数内部函数)
- 如果从函数中返回局部变量的地址,引用或者指针的形式,则变量类型必须是静态的或者常量,即不在栈中存储
- C#不允许声明函数体内的static变量,为何?
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- 不使用引用和全局变量实现函数参数传递
- PHP类中成员变量和函数的引用
- 在C中引用C++语言中的函数和变量
- [教程]JScript中的变量引用规则(补充,函数用法说明)
- 为什么不允许从enum的构造函数中引用static变量?
- PHP中关于在函数内引用全局变量的问题
- php引用(&)变量引用,函数引用,对象引用和参数引用用法详解
- PHP中关于在函数内引用全局变量的问题
- 作为函数参数的临时变量的引用必须是const的
- JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- 函数的返回值--返回变量和引用
- [2012_C++] 函数参数的传递 & 引用变量