@GivenCui
        
        2016-06-01T01:44:48.000000Z
        字数 1957
        阅读 1124
    js高级
如果for循环中有函数,函数内部i的值是跳出循环后的值
<!DOCTYPE html><html lang="en"><head><meta 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>
三种思路 :
一. 把i保存到自定义的属性中,和每个p绑定
二. 闭包解决
三. Function解决,每产生一个实例就产生一个闭包
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);}}}
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;}}
function init3() {var pAry = document.getElementsByTagName("p");for( var i=0; i<pAry.length; i++ ) {(function(arg){pAry[i].onclick = function() {alert(arg);};})(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);}})();}}
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);}}
function init6() {var pAry = document.getElementsByTagName("p");for( var i=0; i<pAry.length; i++ ) {pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例}}
function init7() {var pAry = document.getElementsByTagName("p");for( var i=0; i<pAry.length; i++ ) {pAry[i].onclick = Function('alert('+i+')')}}