我现在的理解就是
闭包就是一个函数,这个函数能访问其他函数的作用域。
因为JavaScript的函数比较特殊,
- 函数内部能访问外层作用域上的变量(作用域、作用域链)
let a = 1;
function f() {
console.log(a);
}
f();
- 函数内能声明函数、或者创建函数表达式
function f1() {
let sth = '本该销毁的变量';
// 能在f1函数里,声明f2函数
function f2() {
console.log(sth);
}
// 通过return、事件绑定,将内部函数保存到了外部
return f2;
}
let f2 = f1();
f2();
在上面,就形成了一个闭包。
正常来说,一个函数执行完,函数作用域内变量的应该销毁,而闭包f2却能访问到f1的函数作用域,导致内存不能释放。如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。