• js 闭包


    说实话其实一直不懂闭包这个东西,不过现在看招聘要求上都是要求懂js闭包,面向对象。es6语法。等等要求。其实我才刚刚看完es6的语法还没有进行过实际的练手,而且现在浏览器对es6的语法也不是全支持需要插件或者是打包工具来转成es5。哈哈哈,我们还是来言归正传说回我们的闭包。对于闭包这个概念我个人觉得最容易理解的还是阮一峰老师的:闭包就是能够读取其他函数内部的函数。但是在javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以将闭包理解成‘定义在函数内部的函数’。所以,在本质上,闭包的作用就是将内部函数与外部函数连接起来的一座桥梁。

    闭包的用途:

    (1)读取函数内部的函数;

    (2)让变量的值始终保持在内存中。

    下面先来一个简单的闭包

    1.

    function test1(){
    function test2(){
    console.log('我家有只可爱的皮皮猫哦!')
    }
    return test2;
    }
    var a=test1();
    a();

    1,定义了一个普通的函数test1;

    2,定义了一个普通函数test2;

    3,在函数test1中返回函数test2;

    4,执行test1把test1的结果赋值给变量a;

    5.执行a;

    上面说到了闭包的两个作用其中一个作用是让让变量的值始终保持在内存中,说道这里那我们就需要知道js的G机制了:在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收了,否则的话这个对象会一直保存在内存中。

    上面的例子test2定义在test1中,因此test2依赖test1,二外部变量a又引用了test2,所以间接的引用了test1,也就说明了GC不会回收test1.下面继续看个例子

    function test1(){
    var i=0;
    function test2(){
    i++;
    console.log(i);
    }
    return test2;
    }
    var a=test1();
    a();
    a();

    i在test1中定义的一个变量,它的值在test2中改变,test2每执行一次,i的值就会在原来的基础上增加1,所以test1会一直存在再变量中。

    当然使用闭包也得注意

    由于闭包的使用会导致很多函数的变量保存在内存中,内存消耗比较大,所以不能滥用闭包,最好是在退出函数之前将不用的变量全部删除。

  • 相关阅读:
    Android基础之项目结构分析
    串口调试,提示the given port name does not start with COM/com异常解决办法,,发现是打印机在搞怪
    C# 通过URL获取图片并显示在PictureBox上的方法
    学习资料集合
    C#语音朗读文本 — TTS的实现
    SQL SERVER 2008安装错误(is not a valid login or you do have permission)
    函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
    SerialPort使用
    Javascript函数的几种写法
    JS验证图片格式和大小并预览
  • 原文地址:https://www.cnblogs.com/zylily/p/9117799.html
Copyright © 2020-2023  润新知