概念:
闭包:指能够读取其他函数内部变量的函数。
特性:
- 可以读取函数内部的变量
- 可以使变量保存在内存中
// 例1:
function f() {
var n = 1;
return function () {
console.log(n);
}
}
var res = f();
res(); // 1(可以读取f函数内部变量n的值)
//例2:
function f1(){
var n = 1;
add = function () { // 未使用var定义,此时的add为全局函数
n += 1
}
function f2() {
console.log(n);
}
return f2;
}
/*操作一*/
var res = f1()
res() // 1
add()
/**函数f2被赋给变量res,f2始终存在于内存中,而f2又依赖f1函数中的变量n,
故f1也始终在内存中,不会在调用结束后,被垃圾回收机制回收。*/
res() // 2
// 若未赋值给res,如下:
/*操作二*/
f1()(); // 1(未持有函数的引用,调用完成即被垃圾回收机制回收)
add();
f1()(); // 1
闭包的缺点:函数中的变量始终被保存在内存中,消耗内存,可能会造成内存泄漏。
//清除所有调用完成后不需要使用的变量
function f1(){
var n = 1;
add = function () {
n += 1
}
return {
f2: function () {
return n
},
clear: function () {
n = null
}
}
}
var res = f1()
console.log(res.f2()) // 1
add()
console.log(res.f2()) // 2
res.clear()
console.log(res.f2()) // null