所以我最近了解了堆栈和堆,以及它们如何在运行时进行管理,但是由于我的测试套件中有一个特定的用例,所以一直困扰着我。
例如,
function foo(myOjb) {
myObj.fooMethod();
}
在上面的代码中,我正在创建对现有对象实例的引用,在我的特定情况下,该实例负责创建http拦截器。我在一次测试中多次运行了此类函数,因为我将创建这些拦截器的逻辑委托给了另一个函数,而不是在我的套件中逐行编写它们,以避免过多的重复样板并提高可读性。所以我的问题是-每个函数退出时(返回未定义)是否释放了所有这些资源?我之所以这样问,是因为对象本身仍然存在于内存中,并且我担心通过这种鲁approach的方法消耗了太多的资源。
答案 0 :(得分:0)
对标题为“是”的问题的简短回答。
让函数参数成为对象引用或原始变量,它们仅在函数执行之前一直存在于堆栈中。
上述机制的一个主要作用是,当参数是对象引用时,只有该引用会从堆栈中弹出。您所引用的实际对象仍然存在于内存中,直到JS垃圾回收过程确定该内存不再被任何变量引用为止。
这是完全自动的,无论您创建或删除了多少对象(通过删除引用),它都会设法清理内存以进行新的分配。
function testObj(myObj) {
return typeof myObj === 'object'
}
var o = {}
testObj(o) //The object o will still live after this call, because variable o points to it even after the function exists.
test({}) // Don't worry about this improvised object. There won't be any references to it after the function call
Here是一篇文章,您可以仔细阅读。