自我调度功能中的词汇环境和记忆

问题描述 投票:0回答:1

这种代码是否存在内存泄漏:

let n = 0;

function foo() {
    const str = '...long string' + (++n);
    setImmediate(() => {
        console.log('str=' + str);
        foo();
    });
}

foo();

我问这个问题是因为,据我了解,每个函数的词法环境都有一个指向创建该函数的词法环境的指针。所以看起来在上面我们将拥有一个不断增长的词汇环境链。

如果是这样,解决这个问题的模式是什么?如果不是,上面的推理有什么错误?

javascript memory-leaks closures
1个回答
0
投票

每个函数的词法环境都有一个指向创建该函数的词法环境的指针。

是的。

因此,在上面我们似乎将拥有一个不断增长的词汇环境链。

不。

foo
有一个指向声明
n
的外部词法环境的指针。创建的每个箭头函数都有一个指向声明
str
的词法环境的指针(反过来又链接到外部函数)。

但是再次调用

foo()
不会增加链,它只会为该函数调用创建一个新环境,链接到外部环境(使用
n
)并在其中声明一个新的
str

活动的不会有一个指向先前运行的词法环境的指针,以便它可以例如访问那里声明的局部变量?

不。指针仅取决于函数的定义位置,而不取决于调用函数时处于活动状态的内容。

© www.soinside.com 2019 - 2024. All rights reserved.