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