我们日常面试的时候难免会遇见面试官提问相关闭包的问题
然而对闭包这个概念又模糊不清
首先函数都有自己的执行环境,该环境定义了变量或者函数访问数据的权限,当离开执行环境后,该环境内的变量会被销毁。
function add() {
let a = 1;
console.log(a); // 1
}
console.log(a);//undefined
这里,我们在函数外去访问函数内定义的变量是访问不了的,控制台输出为undefined
因为函数外的console语句访问变量a的时候执行的时候,是在add()函数外部,不在它的作用域范围内。
那么,可不可以访问呢?
//实现闭包
function add() {
const a = 1;
const addOne = function(b) { return b + a; }
return addOne;
}
const addOne = add();
console.log(addOne(1)); // 2
这里的add() 函数执行完毕之后,会从函数调用栈中被推出,同时局部变量a应该被清理才对, 但我们调用 addOne(1) ,得到的结果却是2。说明a在 add() 执行结束后并没有被销毁,而是进入到了 addOne() 的作用域。
这里的 addOne() 函数被称为匿名函数(anonymous function)也叫做闭包(closure)。



