闭包
闭包是指函数可以访问并操作其词法作用域中的变量,即使在该函数被调用之后,依然可以访问这些变量。简单来说,闭包允许函数记住并访问在其创建时所处的上下文环境。
闭包通常由两部分组成:内部函数和外部函数。内部函数定义在外部函数内部,并且内部函数可以访问外部函数的变量。当内部函数引用了外部函数的变量时,就创建了一个闭包。
- 闭包在实际开发中有多种应用,比如:
- 封装私有变量:通过闭包可以创建私有变量,避免全局命名冲突和直接访问。
- 实现模块化:可以使用闭包来创建独立的模块,并在模块内部定义私有变量和方法,实现代码的封装和隔离。
- 记忆上下文:通过闭包可以在函数执行完毕后仍然访问到相关的变量或参数,用于实现柯里化、缓存等功能。
什么是闭包
<script> /* 1. 什么是闭包? 简单来说闭包就是函数嵌套函数,是让一个函数有权限去访问另一个函数中局部变量,即使外部函数调用结束被释放后,依然可以访问。 2. 闭包的作用? 解决全部变量污染的问题。 3. 闭包的原理? 利用了浏览器的垃圾回收机制,当垃圾回收机制正在回收被释放后的变量时,发现这个变量正在被另一个函数使用,那么这个变量将永远不再被回收,而长期留在内存中。 4. 闭包的优缺点? 变量长驻内存,既是优点,可以供全局访问,也是缺点,不能被释放,造成内存浪费,尤其是IE浏览器可能会造成内存泄露。 使用完变量后,赋值给null,浏览器回收机制看到null后,就会清理这个变量。 */ function fn(){ var a = 3; function me(){ 闭包函数 return a; } return me; } function fn(){ var a = 3; return function (){ 闭包函数 return a; } } function fun(){ var ff = fn(); function me(){return a;} alert(ff()); 3 } fun(); </script>
以下是闭包的几个应用例子
<script> //全局变量累加和? var a = 1; function fn(){ a ++; } fn(); console.log(a); //2 fn(); console.log(a); //3 fn(); console.log(a); //4 </script>
<script> function fn(){ //声明一个数组 let arr = []; //循环添加数据 for(var i = 0;i < 5;i ++){ arr[i] = i; } return arr; //返回数组 } let list = fn(); for(var i = 0,len = list.length;i < len;i ++){ console.log(list[i]); } </script>
<script> function fn(){ //声明一个数组 let arr = []; //循环添加数据 for(var i = 0;i < 5;i ++){ //当实参数量少于形参数量时,多余的形参值为undefined arr[i] = function(i){ return i; }(); } return arr; //返回数组 } let list = fn(); for(var i = 0,len = list.length;i < len;i ++){ console.log(list[i]); //5 * undefined } </script>