闭包
闭包(closure):外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象。即闭包就是能够读取其他函数内部变量的函数。
缺点:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包
例题1
for(var i=0;i<10;i++){
setTimeout(console.log(i),0); //0、1、2、3、4、5、6、7、8、9
}
for(var i=0;i<10;i++){
setTimeout(function(){ console.log(i);//连续的10个10 },0);
}
for(var i=0;i<10;i++){
setTimeout("console.log(i)",0);//连续的10个10
}
for(var i=0;i<10;i++){
(function (n){
setTimeout(function (){
console.log(n); //0~9
},0)
})(i)
}
js单线程
第一个for循环,setTimeout里没有函数,相当于同步执行
第二个for循环,定时器里有函数。相当于一个异步任务,异步任务是只有等执行栈中同步任务执行完毕后才可以执行异步。当for循环同步任务结束后,此时i的值是10。每一次for循环的时候,setTimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,相当于再执行10次异步。
for循环了4次,就放了4次,当主线程执行完成后,才进入任务队列里面执行。
第三个for循环,console.log加了引号类似于函数的调用,类似于第二个for循环。
第四个for循环,