闭包定义
有权访问另一个函数作用域中的变量的函数。
function foo(){
var a = 2;
function bar(){
console.log(a);
}
return bar;
}
var baz = foo();
baz();//2--函数中的变量被访问到了,这就是闭包的作用。
在一般情况下,foo();函数在执行后,内部作用域会被销毁,这是由于引擎的垃圾回收机制在释放不需要的内存空间。而闭包则会阻止函数在执行后内部作用域被销毁。
闭包的用途
- 读取函数内部的变量
- 让这些变量始终保存在内存中,不会由于函数的调用而被销毁
闭包的应用场景
setTimeout
setTimeout的作用是将代码推迟到指定的时间后执行,其实质是setTimeout的机制是等到当前脚本同步的任务或队列事件处理完成后,才将会在指定的时间内执行它。所以如果有setTimeout(f, 0)他表示的是等到当前脚本同步的任务或队列时间处理完成后,再执行它。并不是立即执行。
上面代码的结果就是会输出5次6出来,造成上面的原因就是由于回调函数会在循环结束才会执行。for (var i = 1; i <= 5; i++){
setTimeout(function timer(){
console.log(i);
},i*1000)
}
反思