setTimeout会保持函数不被垃圾回收吗?

时间:2015-07-19 15:59:25

标签: javascript node.js garbage-collection

假设我有以下myFunction& setTimeout二人组

function myFunction(){
    var am_i_eaten = 'ffdfjdhsfhs';

    setTimeout(function(){
        console.log(am_i_eaten);
    },3000);
}

myFunction();

setTimeout是否会使myFunction的范围保持活动(因为它仍然可以毫无问题地打印am_i_eaten),并防止它在我的 Node.JS中被垃圾收集环境?我认为这种行为与浏览器中的行为有些不同?

谢谢!

3 个答案:

答案 0 :(得分:2)

你创建的是一个函数闭包,在setTimeout()回调运行之前,该闭包中的变量不会被垃圾收集。

您可以在概念上将局部变量视为函数,将其作为垃圾收集的单个项目,只有当仍然无法调用的其他代码可以达到这些变量时。因此,在setTimeout()触发之前,变量am_i_eaten仍然可以访问,并且不会被垃圾回收。

这在浏览器和node.js中完全相同(在Chrome和node.js中它实际上是相同的V8 JS引擎)。

答案 1 :(得分:1)

一旦超时操作完成,

setTimeout任意数据将被垃圾收集器自动收集。

答案 2 :(得分:0)

在创建函数时创建函数的javascript范围SetTimeout采用回调函数,该函数保留myFunction范围的引用。因此,在调用回调函数之前,它不会被垃圾收集。