这种代码是否存在内存泄漏:
let n = 0;
function foo() {
const str = '...long string' + (++n);
setImmediate(() => {
console.log('str=' + str);
foo();
});
}
foo();
我问这个问题是因为,据我了解,每个函数的词法环境都有一个指向创建该函数的词法环境的指针。所以看起来在上面我们将拥有一个不断增长的词汇环境链。
如果是这样,解决这个问题的模式是什么?如果不是,上面的推理有什么错误?
每个函数的词法环境都有一个指向创建该函数的词法环境的指针。
是的。
因此,在上面我们似乎将拥有一个不断增长的词汇环境链。
不。
foo
有一个指向声明 n
的外部词法环境的指针。创建的每个箭头函数都有一个指向声明 str
的词法环境的指针(反过来又链接到外部函数)。
但是再次调用
foo()
不会增加链,它只会为该函数调用创建一个新环境,链接到外部环境(使用 n
)并在其中声明一个新的 str
。
活动的不会有一个指向先前运行的词法环境的指针,以便它可以例如访问那里声明的局部变量?
不。指针仅取决于函数的定义位置,而不取决于调用函数时处于活动状态的内容。