闭包
闭包
- (什么是闭包):
- 函数作为参数被传递(函数套函数)
- 函数作为返回值被传递(函数套函数)
- 闭包的作用:
-
- 闭包引用的变量不会被销毁,也就是可以访问
-
- 闭包可以实现局部变量,避免全局变量污染
-
- 总结:
- 闭包也是变量作用域的特殊情况:
- 在变量定义的地方就开始了查找赋值,而不是在函数执行的地方开始查找赋值
函数作为返回值被传递
- 总结:
- 被闭包引用的局部变量,不会被销毁
- 闭包可以实现局部变量,避免全局变量污染
function fun() {
var a = 100;
return function() {
console.log(a);
a++;
}
}
var f = fun();
f(); // 100 函数作为返回值被调用
f(); // 101
- 闭包中的自由变量的值在函数定义的时候查找,不是函数执行的查找
function fun() {
var a = 100;
return function() {
console.log(a);
a++;
}
}
var a = 20
var f = fun();
f(); // 100 闭包中的自由变量在定义的时候查找,不是在执行的时候查找
f(); // 101
函数作为参数被传递
- 总结:
- 闭包中执行的变量的查找在函数定义的地方
function print(fn) {
let a = 100;
fn();
// 这里函数被当成了参数传递了过来,所以在这里执行了函数,形成了闭包
// 所以不能在这里进行赋值,不能赋值100,
}
let a = 50; // 找到了这里
function fn() {
console.log(a);
// 因为 fn函数定义在了这里
// a在这个函数中是自由变量
// 所以去上一层查找a,发现a=50,所以 print(fn) === 50
}
print(fn) // 50