1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。(关于概念博主摘抄以上几点,详情查看 百度百科)
2、表现形式:使函数外部能够调用函数内部定义的变量。
案例1:根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显变量a 是函数内部的fun 的那个变量a 。
<script>function create() {let a = 100;return function () {console.log(a);}}let a = 200;let fn = create();fn();//100// 自由变量的查找,是在定义函数的地方,向上级作用域查找。而不是在函数执行的地方查找。function print(fn){let a = 200;fn();}let a = 100;function fn(){console.log(a);}print(fn)//100</script>
<script>function createCache() {const data = {};console.log(this);return {set: function (key, val) {data[key] = val;},get: function (key) {return data[key];}}}var obj = createCache(); //触发函数obj.set("name", "liming")console.log(obj.get('name'));// 1 隐藏数据,让数据不被外部访问 应用场景:vue-hook,vue-setup,想设置一个变量,不污染全局。/*特点:1.函数的嵌套2。内部函数使用外部函数的变量3.内部函数作为外部函数的返回值*//*缺点:局部变量常驻内存,容易造成内存泄露。*/</script>
