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没有析构函数。

原文地址:https://www.cnblogs.com/chickenfarm/p/13034584.html