现在你们还关注内存泄漏吗?我平常写的js代码压根儿就没考虑这块因素,影响大吗,也不知道什么时候会造成内存的泄漏
不知道JS的这种情况是不是叫内存泄露。
js有gc,所以不需要的变量正常情况下是会被自动回收的。但是如果你一个占有比较大内存的对象用完之后,因为变量赋值的原因,可能会存在还有变量(对象引用)指向这个对象,由于这个对象你后面一直可以访问到,所以gc不会回收这个内存。
一般情况下都是至少一个变量指向一个对象,那么最坏的情况也是所以变量指向的对象都不用了(由于还有变量指向对象,所以gc不会回收这个对象,没有可以访问的变量指向的对象都会被gc回收),这个时候最坏情况下浪费的内存就是所以变量占用的内存。可是实际实际情况下一般都是保留下来的变量都是有用的,所以这种情况下一般也不需要考虑浪费内存的情况。除非你变量很多,而且每个都占用不菲的内存。
还有就是闭包,闭包的意思是即使在函数局部创建的变量,只要有办法访问到它,那么这个这个变量依旧是可以访问的。所以函数运行完并不是所有的局部变量都会被释放掉的,如果循环调用这样的函数将会产生大量的不被释放的局部变量。就像上面说的,这个问题也不是很大。形成闭包的条件是函数的返回的对象可以访问函数的局部变量,你要保存这个返回的对象就必须用一个变量保存(当这个变量指向其他对象时这个返回的对象和其中的局部变量就会被gc回收,因为你外部无论如何也访问不到了),所以这个似乎影响也不大。
比较危险的情况就是一些像 addEventListener
这样的函数(或许是自定义的),这样的函数会把传递给他的函数(或是变量)保存到一个内部的列表中,而这些变量一直以都是可以/需要被访问到的,这样gc就一直不会把这些变量释放,因为这些对象需要能被访问。这个的根本原因还是创建的变量太多。但是像addEventListener
这样的函数保存的变量都是有用的(或许多次绑定同一个函数,那么一般情况下这个函数会被执行多次,就不再会是你想要的结果了)所以这个我觉得这个的影响也不是很大。
所以说,正常情况下一般不需要考虑“内存泄漏”,需要注意的是不要创建太多的变量,而且存在一种“隐式”的变量创建方式--闭包(正常情况下,闭包也是需要一个变量在保证其访问性的,所以只使用闭包也还好)但是如果闭包和像addEventListener
这样的函数结合,闭包产生了大量的变量,保存到了addEventListener
中,那么就会创建非常多的变量,导致“内存泄漏”。其实也不用担心,毕竟这中函数比较少,而且正常情况下加入其中的变量都是"有用的",不小心加多了,都会导致程序出错。
function里用var声明的局部变量在函数执行完就释放了,function外的声明的是全局变量,会一直常驻内存.
转:
匿名函数最大的用途是创建闭包,这是JavaScript的特性之一.
闭包其实就是函数的嵌套,内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.
function checkClosure() { //外层函数
var str = 'China'; //局部变量
setTimeout(
function() { alert(str); } //这是一个匿名函数,可以调用外层函数的变量str
, 2000);
}
checkClosure();
alert('Hello');
//先显示Hello,然后显示China.
checkClosure函数的执行是瞬间的,在checkClosure的函数体内创建了一个局部变量str.
checkClosure执行完毕之后str并没有被释放,因为setTimeout内的匿名函数存在这对str的引用.
待到2秒后函数体内的匿名函数被执行完毕,str才被释放.
收集了一些关于内存泄漏的问题和答案:
js的闭包和回调到底怎么才会造成真的内存泄漏呢?
JavaScript 闭包都会内存泄露吗?
JS内存泄漏排查方法——Chrome Profiles
搞定JavaScript内存泄漏