• JS 闭包


    概念

      简单来讲,就是函数包含函数,内部函数可以访问外部函数(包含函数)的变量和参数,而外部函数(包含函数)却无法访问内部函数的任何变量。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

      这里面涉及到执行上下文和作用域链的知识。当一个函数被调用时,会产生一个执行环境和相应的作用域链。内部函数不仅拥有自身的作用域链,还拥有外部函数的作用域及全局作用域。

      由于闭包会携带包含它的函数(包含函数)的作用域,因此会比其他函数占用更多的内存。过度使用闭包会导致内存占用过多,内存无法释放,造成内存泄漏(被分配的内存既不能被使用,也不能被回收,从而影响性能,甚至导致程序崩溃)。

      解决办法:闭包使用过后,将变量设置为null,解除对DOM对象的引用,顺利减少其引用数,确保内存正常回收。

    例子

      

    function fn(){
        var x= 10;
        return function bar(y) {
            if(y > x) {
                console.log(y)
            }
        }    
    }
    
    var f1 = fn();
       x = 100; f1(
    20); // 20
    f1 = null;

     

    执行fn()时,返回的是一个函数。函数的特别之处在于可以创建一个独立的作用域,返回的这个函数体中,自由变量x要引用fn作用域下的fn()上下文环境中的x。因此,这个x不能被销毁,销毁了之后bar函数中的x就找不到值了。

    因此,这里的fn()上下文环境不能被销毁,还依然存在与执行上下文栈中。

    重点:创建bar函数是在执行fn()时创建的。fn()早就执行结束了,但是fn()执行上下文环境还存在与栈中。

     
    参考原文链接:https://www.cnblogs.com/wangfupeng1988/p/3994065.html
    感谢博主分享!
  • 相关阅读:
    Mesh简介
    不区分大小写字符串比较函数
    python3.5.4安装时老是弹出api-ms-win-crt-runtime-|1-1-0.dll错误的解决方法
    如何在SVN创建分支版本
    Sublime使用小技巧——去掉.dump后缀
    STM32F407串口调试总结
    USB学习笔记
    实验四+005+陈晓华
    实验三+005+陈晓华
    第5次作业+005+陈晓华
  • 原文地址:https://www.cnblogs.com/gaosirs/p/10569969.html
Copyright © 2020-2023  润新知