闭包的定义
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使这个函数是在当前词法作用域之外执行。
再来说的直白一点,闭包就是一个有权限访问其所在词法作用域中变量的一个函数。
通过代码片段理解:
function foo(){
var a=3;
function bar(){
console.log(a);
}
return bar;
}
const a=foo()
a()
foo函数执行之后返回值是bar函数,把bar函数传给变量a并进行调用。引用类型的特性我们知道bar和a本就是指的同一个函数。也就是说bar函数在自己词法作用域以外的地方被执行了。
一般一个函数执行后,它的整个内部作用域都会被销毁,因为js引擎的垃圾处理机制。但是这里的foo函数明显没有垃圾处理。
闭包的主要功能就是在这,因为bar函数仍要对此块作用域进行引用。使得这块本应消失的空间被保存了下来。
闭包的作用
- 可以读取函数内部的变量
- 让这些变量的值始终保持在内存中。
闭包的优缺点
优点
- 阻止一些词法作用域的回收,保存一些有用信息,模拟一个块级作用域。
缺点
- 可以说闭包的优点也是它的缺点,因为他会保存一些信息始终在内存中。故如果出现过多的闭包会导致内存泄漏。
常见的闭包相关问题
1.常见面试题
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
2.回调函数是不是一个闭包?闭包可以调用回调函数吗?