setTimeout 会阻止函数被垃圾收集吗?
Will a setTimeout keep a function from being garbage collected?
假设我有以下 myFunction
和 setTimeout
组合
function myFunction(){
var am_i_eaten = 'ffdfjdhsfhs';
setTimeout(function(){
console.log(am_i_eaten);
},3000);
}
myFunction();
setTimeout
是否会保持 myFunction
的范围有效(因为它仍然可以毫无问题地打印 am_i_eaten
),并防止它在我的 [=22= 中被垃圾收集]Node.JS环境?我认为该行为与浏览器中的行为有所不同?
谢谢!
您创建的是一个函数闭包,并且在 setTimeout()
回调运行之前不会对闭包中的变量进行垃圾回收。
您可以在概念上将函数的局部变量视为单独的项目,只有当仍然可以调用的其他代码无法访问这些变量时,这些项目才会被垃圾回收。因此,在 setTimeout()
回调运行之前,变量 am_i_eaten
仍然可以访问并且不会被垃圾收集。
这在浏览器和 node.js 中的工作方式相同(在 Chrome 和 node.js 中它实际上是相同的 V8 JS 引擎)。
在javascript函数的作用域是在创建函数的时候创建的。 SetTimeout
接受一个回调函数,该函数保留对 myFunction
范围的引用。所以在调用回调函数之前不会被垃圾回收。
setTimeout 超时操作完成后,垃圾收集器将自动收集任意数据。
假设我有以下 myFunction
和 setTimeout
组合
function myFunction(){
var am_i_eaten = 'ffdfjdhsfhs';
setTimeout(function(){
console.log(am_i_eaten);
},3000);
}
myFunction();
setTimeout
是否会保持 myFunction
的范围有效(因为它仍然可以毫无问题地打印 am_i_eaten
),并防止它在我的 [=22= 中被垃圾收集]Node.JS环境?我认为该行为与浏览器中的行为有所不同?
谢谢!
您创建的是一个函数闭包,并且在 setTimeout()
回调运行之前不会对闭包中的变量进行垃圾回收。
您可以在概念上将函数的局部变量视为单独的项目,只有当仍然可以调用的其他代码无法访问这些变量时,这些项目才会被垃圾回收。因此,在 setTimeout()
回调运行之前,变量 am_i_eaten
仍然可以访问并且不会被垃圾收集。
这在浏览器和 node.js 中的工作方式相同(在 Chrome 和 node.js 中它实际上是相同的 V8 JS 引擎)。
在javascript函数的作用域是在创建函数的时候创建的。 SetTimeout
接受一个回调函数,该函数保留对 myFunction
范围的引用。所以在调用回调函数之前不会被垃圾回收。
setTimeout 超时操作完成后,垃圾收集器将自动收集任意数据。