假设我有以下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中被垃圾收集环境?我认为这种行为与浏览器中的行为有些不同?
谢谢!
答案 0 :(得分:2)
你创建的是一个函数闭包,在setTimeout()
回调运行之前,该闭包中的变量不会被垃圾收集。
您可以在概念上将局部变量视为函数,将其作为垃圾收集的单个项目,只有当仍然无法调用的其他代码可以达到这些变量时。因此,在setTimeout()
触发之前,变量am_i_eaten
仍然可以访问,并且不会被垃圾回收。
这在浏览器和node.js中完全相同(在Chrome和node.js中它实际上是相同的V8 JS引擎)。
答案 1 :(得分:1)
setTimeout任意数据将被垃圾收集器自动收集。
答案 2 :(得分:0)
在创建函数时创建函数的javascript范围。 SetTimeout
采用回调函数,该函数保留myFunction
范围的引用。因此,在调用回调函数之前,它不会被垃圾收集。