令人心痛的血淋淋教训,再犯这些错误我不是人。
setTimeout与console.log()执行顺序
setTimeout延时为0时,
setTimeout(function(){
console.log(2);
},0);
console.log(1);
//输出顺序:1,2
setTimeout(function(){
console.log(4);
},0);
setTimeout(function(){
console.log(5);
},0);
console.log(1);
console.log(2);
console.log(3);
//输出顺序:1,2,3,4,5
原因:(记住喽,记不住打死你!!!):页面中所有由setTimeout定义的操作,都将放在同一个队列中依次执行。而这个队列的执行时间需要等到函数调用栈执行完毕后才会执行,也就是等待所有的可执行代码执行完毕,才会轮到setTimeout执行其内部操作,并且按照其时延时间长短顺序执行代码!
再来个高深的:瞅着
setTimeout(function(){
console.log("a:"+a);
},0);
var a = 1;
console.log("b:"+b);
var b = 2;
var c = 3;
var d = 4;
var e = 5;
function fx(c){
console.log("c:"+c);
}
function fn(e,d){
console.log("d:"+d);
setTimeout(function(){
console.log("e:"+e);
},10);
}
setTimeout(function(){
console.log("b2:"+b);
},20);
fn(e,d);
fx(c);
输出结果:
原因:
1、console.log()函数会在setTimeout函数之前执行,并且b在输出之前未被定义所以最先输出undefined;
2、之后,会执行fn函数和fx函数,而fn函数内存在console.log函数,那么它将会先输出d的值4;
3、然后,在fx函数内也存在console.log函数,同样会先输出c的值3;
4、再来比较setTimeout函数时延长短,依次输出1,5,2。
3)
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
console.log(i);
}
//0 1 2 3 3 3
用到了闭包
4)
for (var i = 0; i < 3; i++) {}
console.log(i);
//3,也就说i可以在for循环体外访问到。所以是没有块级作用域。
5)