我们日常面试的时候难免会遇见面试官提问相关闭包的问题
然而对闭包这个概念又模糊不清
<br />
首先函数都有自己的执行环境,该环境定义了变量或者函数访问数据的权限,当离开执行环境后,该环境内的变量会被销毁。
- function add() {
- let a = 1;
- console.log(a); // 1
- }
- console.log(a);//undefined
这里,我们在函数外去访问函数内定义的变量是访问不了的,控制台输出为undefined
因为函数外的console语句访问变量a的时候执行的时候,是在add()函数外部,不在它的作用域范围内。
那么,可不可以访问呢?
<br />
- //实现闭包
- 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)。