<script type='text/javascript'>
    function test() {
        for (var i = 0; i < 5; i++) {
            setTimeout('alert(i)',1000);
        }
    }
    test();
</script>
我想问下为什么这么写,不会弹出0,1,2,3,4?而会报i没有定义。JavaScriptsetTimeout函数

解决方案 »

  1.   

    function test() {
        for (var i = 0; i < 5; i++) {
            setTimeout('alert('+i+')',1000);
        }
    }
    test();
      

  2.   

    因为你传入是字符串'alert(i)',那么就没构成闭包。这个'alert(i)'会在1000毫秒后执行,那时的上下文对象里就找不到i了。function test() {
            for (var i = 0; i < 5; i++) {
    setTimeout(function(){
    alert(i)
    },1000);
    }
    }
    test();你这样写就可以访问到i了,但是仍然有问题,访问到的i都是5。
    因为等1000毫秒后,循环已经执行完了,此时i就是等于5。function test() {
    for (var i = 0; i < 5; i++) {
    (function(i){
    setTimeout(function(){
    alert(i)
    },1000);
    })(i)
    }
    }
    test();最终,改成这样就可以了..
    因为中间那个匿名函数将循环中的i保存在它的上下文对象里了。setTimeout里的函数通过闭包访问到这个i。抱歉啊,水平有限,自己都感觉解释的不是很通俗。楼主理解不了的话。建议先记住几种方案,解决问题。
    然后多理解下javascript的闭包,作用域链,函数上下文对象等概念。
      

  3.   

    settimeout 里面应该是个function,而不是语句。
      

  4.   

    function test() {
            
            for (window.i1 = 0; window.i1 < 3; window.i1++) {
                setTimeout('alert(window.i1)',1000);
            }
        }
        test();其他问题不管  为什么不能访问 你看这个代码
      

  5.   

    永远都给setTimeout的第一个参数传递一个function,哪怕这个function只有一条语句。
      

  6.   

    因为执行alert(i)的时候, 作用域并不在那个函数里了, for循环中的i值根本无法读取的到