当参数是对象时,函数参数变量是否会从堆栈中弹出?

时间:2019-05-21 06:25:51

标签: javascript memory-management reference stack

所以我最近了解了堆栈和堆,以及它们如何在运行时进行管理,但是由于我的测试套件中有一个特定的用例,所以一直困扰着我。

例如,

function foo(myOjb) {
   myObj.fooMethod();

}

在上面的代码中,我正在创建对现有对象实例的引用,在我的特定情况下,该实例负责创建http拦截器。我在一次测试中多次运行了此类函数,因为我将创建这些拦截器的逻辑委托给了另一个函数,而不是在我的套件中逐行编写它们,以避免过多的重复样板并提高可读性。所以我的问题是-每个函数退出时(返回未定义)是否释放了所有这些资源?我之所以这样问,是因为对象本身仍然存在于内存中,并且我担心通过这种鲁approach的方法消耗了太多的资源。

1 个答案:

答案 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是一篇文章,您可以仔细阅读。