面试题答案
一键面试实现代码
function createCounter() {
let count = 0;
return function() {
return count++;
};
}
优化解释
- 避免内存泄漏:在上述代码中,
createCounter
返回的内部函数形成了闭包。闭包会持有对外部函数作用域的引用,这里count
变量在外部函数作用域中。只要内部函数存在,count
就不会被垃圾回收机制回收。但是这并非内存泄漏,因为这种引用是有意且合理的。如果没有闭包,每次调用内部函数都无法记住count
的状态。 - 性能提升:从性能角度,这种简单的闭包使用不会带来显著的性能开销。相比于每次调用函数都重新声明和初始化
count
变量(例如在非闭包场景下,将count
定义在内部函数中),闭包使得count
只在createCounter
首次调用时初始化,后续调用内部函数只是对其进行操作,减少了重复的变量声明和初始化开销。
闭包的作用与潜在影响
- 作用:闭包允许内部函数访问并操作外部函数作用域中的变量,在这个场景下,使得
count
变量的状态得以保持,实现了计数器的功能。它提供了一种数据隐藏和封装的机制,外部代码只能通过返回的内部函数来间接访问和修改count
。 - 潜在影响:虽然在这个简单场景下没有明显问题,但在复杂应用中,如果闭包使用不当,可能导致内存占用过高。例如,如果内部函数一直不释放(例如被添加到全局对象中且不会被移除),那么闭包所引用的外部作用域中的所有变量都不会被垃圾回收,即使这些变量不再被需要,从而导致内存泄漏。此外,由于闭包会增加作用域链的长度,在查找变量时可能会有轻微的性能损耗。