zoukankan      html  css  js  c++  java
  • JavaScript_闭包、内存泄漏、内存溢出

    闭包、内存泄漏、内存溢出

    闭包就是能够读取其他函数内部变量的函数。

    例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。

    在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 

    1、「函数」add和「函数内部能访问到的变量」counter(也叫环境)的总和,就是一个闭包。

    var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
    })();

    add();
    add();
    add();
    //计数器为3

    arr.sort((a,b)=>{return a-b;});//这里匿名排序函数和函数能访问到的a,b就是一个闭包。

    2、使用闭包的目的—隐藏变量。为了不让num暴露为全局变量让任何地方可以修改,但是又需要num能被修改,所以使用bagAdd()来改变num。
    3、闭包会造成内存泄露?
      1)、IE6时代有bug,闭包会造成内存泄漏。
      2)、闭包不会造成内存泄漏。程序写错了才会造成内存泄漏。泄漏了不是闭包的问题,是写的代码的问题。所以放心使用闭包。
      3)、避免内存泄漏,可以严格代码规范,对象的使用-管理-释放。

    内存溢出(out of memory)即内存不足,是指申请的不够使用,比如申请了int 32位只给了int 16。
    内存泄漏(memory leak)是指程序申请内存后无法释放,内存无法被复用,从而导致内存不足溢出了。
    预防内存泄漏,需要我们显示的移除未使用的程序的引用,主动或被动调用语言的垃圾回收机制释放内存,合理的运用对象池。

    类的单例不会造成循环引用

    class Manager() {
        public static _instance;
        public static ins() {
            if (!this._instance) {
                this._instance = new Manager();
            }
            return this._instance;
        }
    }
    //在使用单例的时候,容易误解成 Manager 的 ins 获取到的 Manager实例 中还有ins,造成循环嵌套。事实是Manager是一个类,ins 获取到的是一个实例,如果调用实例的 ins 方法会再次创建一个实例。所以不能存在循环嵌套引用。
    

    JS底层Prototype和Construct

    析构函数~ojbect(){}是对象释放时最后调用的支持重写,JS没有析构函数。

  • 相关阅读:
    《面试系列一》一个怂到极点的开始
    NuGet 私房服务使用帮助
    Nuspec 范本文件
    送给前线码农的话 – 大牛们的经典语录
    Visual Studio 增加源码头注释
    为 Orchard 增加 MVC 的脚手架.
    为 Orchard 增加扩展的存储位置
    Orchard 瘦身优化
    Hybrid Multiple Attention Network for Semantic Segmentation in Aerial Images
    【nvidia jetson xavier】 Linux系统安装+Deepstream 5.1环境部署
  • 原文地址:https://www.cnblogs.com/chickenfarm/p/13034584.html
Copyright © 2011-2022 走看看