Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件处理程序分配和内存泄漏_Javascript - Fatal编程技术网

Javascript 事件处理程序分配和内存泄漏

Javascript 事件处理程序分配和内存泄漏,javascript,Javascript,我理解JavaScript中循环引用的概念以及避免循环引用以防止内存泄漏的重要性,但是我还没有找到任何关于将闭包或原型的成员函数分配给事件处理程序如何影响垃圾收集的信息 例如,假设我写了以下任一项: var o = {}; o.var = 10000000; o.func = function() { /*Do something that does not involve o.var*/ }; function p() { } p.prototype.var = 100000; p.prot

我理解JavaScript中循环引用的概念以及避免循环引用以防止内存泄漏的重要性,但是我还没有找到任何关于将闭包或原型的成员函数分配给事件处理程序如何影响垃圾收集的信息

例如,假设我写了以下任一项:

var o = {};
o.var = 10000000;
o.func = function() { /*Do something that does not involve o.var*/ };

function p() { }
p.prototype.var = 100000;
p.prototype.func = function () { /*Do something that does not involve p.var*/ };
。。。然后继续执行以下任一操作:

var div = document.getElementByID('div');
div.onclick = o.func;

var instance_of_p = new p();
var div = document.getElementByID('div');
div.onclick = instance_of_p.func;
将func()赋值给DOM事件处理程序是否会阻止GC收集整个对象?

是。阅读JavaScript中gc的工作原理。在您的情况下,
o
在全局或闭包范围内仍然可用,因此不会收集它。该函数仍然可用,尽管可能不使用


顺便说一句:有。

这可能取决于发动机。由于
func
关闭了
o
,因此它确实可以访问它。一些引擎可能会意识到它不能访问
o
。。。您必须引用一个html元素,它引用一个JS对象,它引用同一个html元素(?)。。。我不确定最后一个…=)事实上,我是故意的。虽然在这样一个简短的示例中可能看起来很愚蠢,但在我多次引用同一元素的长代码中,为了易读性和效率,我将把它分配给一个变量。此策略基于GC在我完成时收集变量,因为它只用于对DOM进行赋值,而不被任何其他对象引用。如果这是一个错误的说法,我想知道。。。