一条有趣的前端面试题(1)

2017-06-14  本文已影响0人  谢小逸

以下是几种for循环输出代码


1. 代码一

for (var i = 0; i < 5; i++) {
  console.log(i);
}

这几行代码的结果是直接输出0~4


2.代码2

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
}

因为SetTimeOut会延迟执行,所以执行到consolo.log()的时候i已经变成了5,所以结果是开始输出一个5,然后隔一秒输出一个5,一共5个5


3.代码3

for (var i = 0; i < 5; i++) {
(function(i){
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
  })(i)
}

因为闭包每次执行,并每次都带有参数i,所以输出的结果是先输出一个0,然后分别隔一秒输出2,3,4


4.代码4

for (var i = 0; i < 5; i++) {
(function(){
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
  })(i)
}

因为闭包内部没有保存对参数i的引用,所以结果是开始输出一个5,然后隔一秒输出一个5,一共5个5


5.代码5

    for (var i = 0; i < 5; i++) {
        setTimeout((function() {
            console.log(i);
        })(i), 1000 * i);
    }

这里给SetTimeout传递了一个立即执行函数,SetTimeout可以接受函数或者字符串作为参数,但是参数为立即执行函数,相当于underfind

SetTimeout(相当于underfind,1000*i);

所以输出的结果为:立马输出0~4


6.代码6

    setTimeout(function() {
        console.log(1)
    }, 0);
    new Promise(function executor(resolve) {
        console.log(2);
        for (var i = 0; i < 10000; i++) {
            i == 9999 && resolve();
        }
        console.log(3);
    }).then(function() {
        console.log(4);
    });
    console.log(5);

首先setTimeout,会先设置一个定时,在定时结束后将传递这个函数放到任务队列里面,因此开始肯定不会输出1。然后是一个Promise,里面的函数是直接执行的,因此应该直接输出 2 3 。然后,Promise的then应当会放到当前tick的最后,但是还是在当前 tick 中。因此,应当先输出 5,然后再输出 4 。最后在到下一个 tick,就是 1 。"2 3 5 4 1"

上一篇 下一篇

猜你喜欢

热点阅读