面试题-----什么是闭包以及闭包的使用讲解

.
.
闭包,我个人理解就是在函数中的函数,内部的函数可以访问外部函数的变量,外部函数的变量就是内部函数的一部分。

闭包的概念

闭包就是能够读取其他函数内部变量的函数。
详细的来说,闭包是指有权访问另外一个函数作用域内部变量的函数

.
有时候我们需要使用函数内部的局部变量,正常情况下是办不到的。通过闭包可以解决这个问题。

闭包的作用:
  • 读取函数内部的变量
  • 让这些变量的值保存在内存里面,实现数据共享(生命周期比较长)。

.

var cnt=(function(){
    var i=0;
    return function(){
        alert(i);
        i++;
    }
})();

cnt();	// 0
cnt();	// 1
cnt();	// 2
cnt();	// 3

由此可见在第二次调用 cnt() 的时候,i = 1 这就证明了在 局部变量 i 一直保存在内存中,并没有在 cnt() 第一次调用之后被自动消除。

因为在 内部函数是外部函数的子函数,而内部函数被赋予了一个全局变量 i,导致 内部函数一直存在,而内部函数的存在又依赖于外部函数,所以,外部函数也一直存在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
.

闭包的特性:
  1. 函数内部再嵌套函数
  2. 内部函数可以引用外层函数的参数和变量
  3. 参数和变量不会被垃圾回收机制回收
闭包的使用场景:
  • 函数作为参数传递
  • 函数作为返回值返回

.

函数作为参数传递

function f1(){
        var num = 10;
        return function () {
            console.log('f1', num)
        }
    }
    function f2(fn){
        var num = 12
        console.log('f2', fn())
    }
    var Fn = f1()
    f2(Fn);		//   f1 10  此时的num取值为 10

.

函数作为返回值返回

function cnt() {
    var i = 0;
    return function add(){
        i++;
        console.log(i)
    }
};
var f1 = cnt()
f1();	// 	1
f1();	// 	2
使用闭包注意事项:
  • 因为闭包会使,函数中的变量一直保存在内存中,内存消耗大,所以不能滥用闭包,否则会导致内存泄露,影响网页的性能。(解决方法:闭包使用完了后,应该立即释放资源,将引用变量指向null。)
  • 闭包会在父函数外部改变父函数内部的变量值。如果你把父函数当对象(object)使用,把闭包当做它的公共方法,把内部变量当做私有属性使用的时候,要注意不要随意修改父函数内部的变量值。

.

.

参考 https://www.cnblogs.com/chuntaoj/p/5996216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值