解决方案 »

  1.   

    1、for (var i = 0; i < 10; i++) { 执行完成后,才执行setTimeout 
    此时i=10;   for (var j = 1; j <= i; j++) {  执行了10*10=100次,每次输出“汪汪”
    2、var dog = function () {
        return '汪';
    };
    var cat = function () {
        return '喵';
    };(function () {
        if (cat() === '喵喵') {
            dog = function () {
                return '汪汪';
            }
        }    function cat() {
            return '喵喵';
        }
    })();
    var count=0,i=0,j=0;
    function callDog(){
    if ( i < 10 ) {
                   j++;
           if(j > i){j=1;i++}
            count++;
            console.log(count +"--"+dog());
            setTimeout(callDog,1000);
            }
    }
    callDog();
      

  2.   


    for (var i = 0; i < 10; i++) {
         (function(i){
         setTimeout(function () {
    for (var j = 1; j <= i; j++) {
                 console.log('第 '+i+' 次输出 '+dog()+i+' 次');
             }
             },1000 * i)
             })(i);
    }
      

  3.   

    1. 异步,执行setTimeout时i=10,相当于执行了10*10次循环
    2. 不要for循环,让i在setTimeout自调用当中递增
      

  4.   

    十分感谢,不过能给我讲一讲其中的道理么?
    实际上就是考你对闭包的了解。
    for循环执行完成之后,i的值就是其最后一次执行的值+1,虽然定义的是在for中,但是依然在全局中能够使用,所以你后边使用i的值时,都是最后一次执行for的值+1即是:10
      

  5.   

    十分感谢,不过能给我讲一讲其中的道理么?
    实际上就是考你对闭包的了解。
    for循环执行完成之后,i的值就是其最后一次执行的值+1,虽然定义的是在for中,但是依然在全局中能够使用,所以你后边使用i的值时,都是最后一次执行for的值+1即是:10
    大神你好,能留个QQ么?有技术问题的话我想和你交流。
      

  6.   

    for (var i = 0; i < 10; i++) {
        setTimeout(function () {
                for (var j = 1; j <= i; j++) {
                    console.log(dog());
                }
            },
            1000 * i);
    }
    执行顺序,先执行外层的for循环10次,然后i=9
    settimeout有延迟,所以里面的 j<=i  这里的i在第一次执行的时候就是9
    里面的for循环也是执行了10次
    嵌套下来就执行了100次。
    for (var i = 0; i < 10; i++) {
                (function(i){
                    setTimeout(function () {
                        for (var j = 1; j <= i; j++) {
                            console.log('第 '+i+' 次输出 '+dog()+i+' 次');
                        }
                    },1000 * i)
                })(i);
            }
    这种形式i没有被释放,传入里面for循环的时候,就是 0,1,2,3,4,5,6,7,8,9
    延迟分别为1000 2000 3000....9000
    所以延迟0秒执行一次,1秒执行一次9秒执行一次~
      

  7.   

    var sum = 0;
    for(var i=0; i<10; i++)
    {
    setTimeout(function(i)
    {
    console.log(i);
    for(var j=1; j<=i; j++)
    {
    sum++;
    console.log("第"+sum+"次"+dog());
    }
    }(i), 1000*i);
    }
    这样也是可以的。