如何理解三句核心代码的区别?  function test()
 {
     for(i=0;i<5;i++)
     {
     //(function(i){setTimeout(function(){alert(i)},5000);})(i);
     //setTimeout("alert(" + i + ")",5000);
     setTimeout(function(){alert(i)},5000);
    }
 }
 test();

解决方案 »

  1.   

     setTimeout(function(){alert(i)},5000);
    循环执行某个方法
      

  2.   


    (function(other){setTimeout(function(){alert(other)},5000);})(i);//1
    setTimeout("alert(" + i + ")",5000);//2
    setTimeout(function(){alert(i)},5000);//3setTimeout延时执行某函数或语句
    SyntaxiTimerID = window.setTimeout(vCode, iMilliSeconds [, sLanguage])
    ParametersvCode Required. Variant that specifies the function pointer or string that indicates the code to be executed when the specified interval has elapsed. 
    iMilliSeconds Required. Integer that specifies the number of milliseconds. 
    sLanguage Optional. String that specifies one of the following values: JScript Language is JScript. 
    VBScript Language is VBScript. 
    JavaScript Language is JavaScript. 
     先从第三个说起.setTimeout内传入的是个函数的指向,该函数对i有引用.当5000ms过后,i已经遍历完了,最终值是4.所以此时执行每次alert都是4.
         eval('var s'+i+' = i');
         setTimeout(function(){alert(s2)},5000);
    可以对比这段代码理解,或者在test();后改变i的值,i = 12;
    第二个,setTimeout传入的是一段代码,该段代码在拼接的时候i并没有遍历完全,拼接完后,立即开始计时,所以最后结果出来依然保持了当时的顺序第一个,相当与执行了一个匿名函数,该函数的参数是遍历中的i,可以将此函数的形参变为别的以免混淆(如上),此时alert内的引用是即时传入的i,即上文中的other.
      

  3.   


    setTimeout(),只定时执行一次.
      

  4.   

    没有实质性区别。setTimeout可接一段代码,即时编译,也可接一个函数,到时候调用。
    第一句定义了一个匿名函数并立即执行,该函数只有一句话,就是设定到某个时间执行某个函数。
    第二句就是设定某个时间解析并执行一小段js代码。
    第三句设定到某个时间执行某个函数