setTimeout会不会被垃圾收集?

假设我有以下myFunctionsetTimeout二重奏

 function myFunction(){ var am_i_eaten = 'ffdfjdhsfhs'; setTimeout(function(){ console.log(am_i_eaten); },3000); } myFunction(); 

setTimeout保持myFunction的作用域(因为它仍然可以打印am_i_eaten而没有问题),并防止它在我的Node.JS环境中被垃圾收集? 我相信这个行为与浏览器中的行为有些不同。

谢谢!

你创build的是一个函数闭包,直到setTimeout()callback运行之后,闭包中的variables才会被垃圾回收。

你可以在概念上把局部variables看作是一个单独的项目,只有在没有其他可以被调用的代码可以访问这些variables的情况下才被垃圾收集。 所以,直到你的setTimeout()触发,variablesam_i_eaten仍然可以访问,不会被垃圾收集。

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

在函数的javascript范围内创build函数时创buildSetTimeout需要一个callback函数,它保留了myFunction范围的引用。 所以它不会被垃圾收集,直到callback函数被调用。