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

Declare vars inside javascript function and memory management

本文关键字:声明 变量 管理 内存 javascript 函数      更新时间:2023-09-26

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

function foo() {
    var a = "This is my content";
    $('#myElemId').on('click', function() {
        $(this).html(a);
    });
}

我的问题是:

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

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

在您的情况下,事件回调仍然需要变量 a,因此不会解除分配。它仍然存在,

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

你可以看到这个小提琴 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";
}
这是一个

典型的closure问题。 实际上匿名函数会保留foo的变量环境的副本,但不会保留a。 因此,当foo ENNDS 执行时,它的执行上下文被销毁并a。 匿名函数仍然可以通过其作用域链引用a