闭包是作用域应用的特殊情况,有两种表现:
1、函数作为参数被传递
function foo (fn) {
let a = 1;
fn();
}
let a = 2;
function fn () {
console.log(a);
}
foo(fn);//2
此时输出为2的原因是:
调用fn函数时,从fn函数定义的作用域开始寻找a值,fn定义在全局作用域,而全局作用域声明了a的值为2,所以输出为2。
2、函数作为返回值被返回
function foo () {
let a = 1;
return function () {
console.log(a);
}
}
let test = foo();
let a = 2;
test();//1
此时输出1的原因是:
因为foo函数返回一个函数,所以调用test函数实际上就是调用foo返回的函数,那回到该函数定义的作用域开始寻找a值,该函数上级作用域即foo函数的作用域里声明a的值为1,所以输出为1。