I dont't know the reason exactly, but I can tell you that 'i' seems to be a Global variable even if you put the codes in a function.use my code:<body>
<script>
Function.prototype.getHandler = function (obj) {
var oThis = this;
var argu = Array.prototype.slice.call(arguments, 1);
return function (){
oThis.apply(obj, argu);
};
};function doClick(x) {
alert(x);
};
for (var i=0;i<10;i++) {
var o = document.createElement("input");
o.attachEvent("onclick", doClick.getHandler(null,i));
document.body.appendChild(o);
}
</script>
</body>If you don't know about "call","apply", you can see the Javascript Reference, or
http://community.csdn.net/Expert/topic/3191/3191873.xml?temp=.337063Good luck.

解决方案 »

  1.   

    <script>
    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    eval("o.attachEvent(\"onclick\", function(){doClick(" + i + ");});")
    document.body.appendChild(o);
    }
    </script>
      

  2.   

    楼上的,Good Work :)
      

  3.   

    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<3;i++) {
    var o = document.createElement("input");
    o.setAttribute("idx", i);
    o.attachEvent("onclick", function(){ doClick(event.srcElement.idx); });
    document.body.appendChild(o);
    }
      

  4.   

    1. eval("o.attachEvent('onclick', function(){doClick("+i+");});")
     在传递i变量
    2. o.attachEvent("onclick", function(){ doClick(i); });
     在传递数字,没有传递变量
      

  5.   

    to llhdf:if the arguments not the number or string, but the object ?
      

  6.   

    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    // o.attachEvent("onclick", function(){ doClick(i); });
    o.attachEvent("onclick", new Function("doClick("+i+")"));
    document.body.appendChild(o);
    }
      

  7.   

    说了半天还是emu_ston(吃的就是没文化的亏) 给出了正解
      

  8.   

    to yonghengdizhen:
    传递参数是object时,试过了??
      

  9.   

    是这样的,attachEvent虽然把执行定义好了,但是,并没有执行。而当真正click的时候,这时i的值已经是10了,所以,会alert出来10。function(){}相当于Function()函数,以下这么写估计就会很清楚了。<script>
    function doClick(x) {
    alert(x);
    }for (var i=0;i<10;i++) {
    var o = document.createElement("button");
    o.onclick = Function("doClick(i);");
    document.body.appendChild(o);
    }</script>
      

  10.   

    为了验证我的说法,可以在循环后对i重新赋值,看看照原来的定义将会全都alert 4的。<script>
    function doClick(x) {
    alert(x);
    };for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    o.attachEvent("onclick", function(){ doClick(i); });
    document.body.appendChild(o);
    }i = 4;</script>
      

  11.   

    我觉得是这样, attachEvent中的function里面引用时,变量被看成全局变量了,所以会这样至于为什么会这样我不太清楚,我的做法是返回一个函数引用,这样可以避免。
      

  12.   

    function(){}根Function()的效果是一样的。{}中的代码并不会立刻执行的。
      

  13.   

    以下是我给的正解,这才是最正确的。<script>
    function doClick(x) {
    alert(x);
    }function mapping(o, i)
    {
    o.onclick = function()
    {
    alert(i);
    }
    }for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    mapping(o, i);
    document.body.appendChild(o);
    }
    </script>
      

  14.   

    呵呵,忘记了还有个doclick改下<script>
    function doClick(x) {
    alert(x);
    }function mapping(o, i)
    {
    o.onclick = function()
    {
    doClick(i);
    }
    }for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    mapping(o, i);
    document.body.appendChild(o);
    }
    </script>
      

  15.   

    fason说的没错,i的定义虽然写在for循环里,但是i依然是全局的。跟这个i的关系不太大。为了避免混淆,再次修改代码。<script>
    function doClick(x) {
    alert(x);
    }function mapping(element, value)
    {
    element.attachEvent("onclick", function()
    {
    doClick(value);
    })
    }for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    mapping(o, i);
    document.body.appendChild(o);
    }
    </script>
      

  16.   

    刚看fason的答案,是对的,但是没有必要那么麻烦啊。
      

  17.   

    eval()

    Function("doClick(" + i + ")")属于投机取巧的答案。
      

  18.   

    搞不懂,莫名其妙,也许简单真的是eval那样才最简单。
      

  19.   

    唉,听听我的一点建议(只是建议)<script>
    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    eval("o.attachEvent(\"onclick\", function(){doClick(" + i + ");});")
    document.body.appendChild(o);
    }
    </script>这段代码没问题,但是不能放到<head></head>里了!!必须放到</html>后面才能正确执行!!这样说你就能名白为什么了吧:)
      

  20.   

    to runmin:如果传递的不是string,或number,eval在这里就不能用啦
      

  21.   

    菜鸟也插插话啦首先,javascript只有两种级别变量:scripting级就相当于public,所有想象得到的地方都可以访问;另一种就是函数内,仅函数内可访问,而for,if等语句中定义的变量同样只属于这两种,未定义的变量全部被认为是scripting级的如:for (var i=0; i<5; i++){} alert(i);function f(){ for (var i=0; i<5; i++){} alert(i); }<body onLoad="f();alert(i)"></body><script>
    function f(){ for (i=0; i<5; i++){} }
    </script>其次,runming给出了正确的答案,但是他并没有说清为什么原来的是错的function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    o.attachEvent("onclick", function(){ doClick(i); });
    document.body.appendChild(o);
    }在o.attachEvent中创建的function并没有任何参数,i不过是for创建的一个变量而已,这就相当于function在函数体{}中的语句中直接使用变量i来调用函数doClick,因此i的任何改动都将反应出来,跟i是引用还是值并没有关系,而runming的答案正是改正了这个问题function doClick(x) {
    alert(x);
    }function mapping(element, value)
    {
    element.attachEvent("onclick", function()
    {
    doClick(value);
    })
    }for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    mapping(o, i);
    document.body.appendChild(o);
    }for中创建函数时i的值已赋值给value,如是引用,则value也已得到i的引用,这样,即使i已改变,也不会影响到value的值再次,为了验证function中确实是使用变量i直接调用doClick,改代码如下
    <script>
    function doClick(x) {
    alert(x);
    };function f()
    {
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    o.attachEvent("onclick", function(){ doClick(i); });
    document.body.appendChild(o);
    }
    }
    </script><body onload="f()")>此时,alert的值依然是10,这可以说明function确实是使用了i,这个i在这里虽然是函数级变量,但是由于function创建于f,所以i对于function来说仍然是全局的,也就是创建的每个function都使用变量i来调用doClick,因此仍然是一样的最后,说说所谓的“投机”做法<script>
    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    eval("o.attachEvent(\"onclick\", function(){doClick(" + i + ");});")
    document.body.appendChild(o);
    }
    </script>很明显,在for中创建的function 本身就使用常数了,i的位置其实变成一个字符串常数,也就是说function的内容就是doClick(某常数),自然这个常数是不会被i影响的,所以在值类型的时候,此方法是可行的,而使用引用类型时则不行<script>
    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var d = new Date(2000,i+1,i+1);
    var o = document.createElement("input");
    eval("o.attachEvent(\"onclick\", function(){doClick(" + d + ");});")
    document.body.appendChild(o);
    }
    </script>上面的代码是错误的,因为d是对象而不是值总结:严重同意runming中
      

  22.   

    完整点:<body>
    <script>
    function doClick(x) {
    alert(x);
    }function mapping(sHandler, element, f)
    {
    var argu = Array.prototype.slice.call(arguments, 3);
    element.attachEvent(sHandler, function()
    {
    f.apply(null,argu);
    })
    }for (var i=0;i<10;i++) {
    var o = document.createElement("input");
    mapping("onclick", o, doClick, i);
    document.body.appendChild(o);
    }
    </script>本质上和我写的还是一样的
      

  23.   

    至于为什么放到</html> 才能执行,因为html 还没有加载完毕
    可以在<SCRIPT LANGUAGE="JavaScript" defer> 加defer 参数,就应该可以执行了。
      

  24.   

    fason让我来这找答案。得花时间看看这贴。 up
      

  25.   

    Re:   dsclub(兀儿 - 干部)   、  littleboys(飞龙)不一定必须放到</html>后面才能正确执行!放到</form> 或 </body> 后面也能正确执行。
    <html> <body> <form>
    // html code here
    </form>
    </body>
    </html>************************************关于for循环的第一个表达式。
    for(var i=0;i<10;i++)  //这个i是与for平齐的,平级的
    //这样说吧,等价于在for语句上面已经声明了i,就像下面代码一样
    var i=0;
    for(i=0;i<10;i++)
    //这样看来,i就是全局的了(更确切说,i和for的作用域是一样的)
    <script language="javascript">
    for(var i=0;i<10;i++) // i全局的</script><script language="javascript">
    function f(){
        for(var i=0;i<10;i++) // i局部的,f()函数内有效
    }
    </script>
      

  26.   

    上面关于for中的i说的好像不对,还要在考虑一下。白天在公司不能上网真烦。
      

  27.   

    不错,javascript里面for循环确实会扩大在里面定义的循环变量的作用域:var i=0;
    for (var i=0;i<10;i++) {}
    alert(i)结果和期望的不同。
      

  28.   

    function doClick(x) {
    alert(x);
    };
    for (var i=0;i<10;i++) {
    var o = document.createElement("input");
             o.i=i;
    o.attachEvent("onclick", function(){ doClick(this.i); });
    document.body.appendChild(o);
    }