在 javascript 函数和内存管理中声明变量

Declare vars inside javascript function and memory management

一段时间以来,我一直怀疑这种类型代码中的 js 潜在内存泄漏:

function foo() {

    var a = "This is my content";

    $('#myElemId').on('click', function() {

        $(this).html(a);

    });
}

我的问题是:

当调用 foo 时,我想它创建了一个执行对象,为 var a 分配内存并将事件侦听器分配给 dom 元素。一旦 foo returns 它应该释放执行对象,但我认为它不会因为点击侦听器仍然引用 var a ,对吧?

这是一个典型的 closure 问题。实际上,匿名函数将保留 fooVariableEnvironment 的副本,但不会保留 a。所以当 foo 结束执行时,它的执行上下文和 a 一样被销毁。匿名函数仍然可以通过它的范围链引用 a

你是对的。 变量只有在不再需要时才会被释放。

在您的情况下,事件回调仍然需要变量 a,因此它不会被释放。它仍然存在,

正如elaijuh对这个post的另一个回答所说,它是真实变量的副本,实际上它不是存储在事件回调函数中的副本。

你可以看到这个fiddle http://jsfiddle.net/3y7qbjav/ ,所以你仍然可以在绑定点击事件后更改var a 的值。所以变量没有释放。

function foo() {

    var a = "This is my content";

    $('#myElemId').on('click', function() {

        $(this).html(a);

    });
    a="new content after the event binding";
}