写在开头:
理解闭包其实只需要理解一句话:函数的作用域是在函数定义时就确定了的,和在哪里调用这个函数无关
闭包能干吗?
- 根据 JS 的函数作用域来了解,JS 函数内部的局部变量只能在函数内部访问,通过闭包我们可以在函数外部来访问函数内部的局部变量。
- 函数体内的变量的值,可能会随着函数的反复调用重新赋值,通过闭包我们可以让这些变量的值始终保持在内存中不被重新赋值。
闭包是什么?
闭包是一个函数
这个函数是在另一个函数内部定义了的,且通过return返回的函数
返回的函数内操作了一个局部变量
返回的函数被接收之后,再调用,就可以间接操作局部变量。
例如:
function outside() {
var str = "outside";
return function() {
str = "inside";
console.log(str);
}
}
let getStr = outside();
getStr(); // inside
function outside(value) {
var str = "inside";
return function() {
str = value;
console.log(str);
}
}
let getStr = outside("outside");
getStr(); //outside
闭包的分类
1. 函数闭包:

2. 对象闭包:

obj 中有个 getName 函数,函数返回的是一个匿名函数,而匿名函数返回的是 this 下的 name, 当 obj.getName 赋值给 re 时,实际上就是将这个匿名函数赋值给 re,然后调用 re 时,re属于全局作用域,所以 re 的 this 指向的就是 window 对象。
闭包的缺点
闭包的问题:内存泄漏(内存实在无法释放,造成系统内存的浪费)
网友评论