以下是几种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"