0

如果我有一个创建对象的函数,请执行一些操作并返回它。如果对象是通过引用传递的,这是否意味着创建对象(或函数的作用域链)的函数将不可用于垃圾回收?从函数创建和返回对象:可以避免垃圾回收吗?

示例代码:

function convertArrayToObj(array){ 
    var newObj = {}; 
    array.forEach(function(item, index){ 
     newObj[index] = item; 
    }); 
    return newObj; 
} 

我希望我做了我的怀疑明确

+0

不,范围可用于包装,在功能执行结束后没有任何参考。该对象独立于其创建范围。你可能会对封闭感到困惑。 –

回答

0

它(执行上下文)将有资格进行垃圾回收。

(函数对象本身将被保留在世谁把它称为以开始,直到该对象死亡 - 但它不会被保留在返回“newObj”活)

仅仅因为一个参考该对象存储在本地变量中并不意味着该对象已经获得了对其创建者的引用。

+0

谢谢!所以返回一个对象的函数将被垃圾回收,但是返回一个返回对象的函数的函数(在'outer'函数作用域内创建的)不会(因为它是一个闭包)?我对么? – elledienne

+0

“一项功能”涉及两个对象。函数对象本身以及调用该函数时创建的执行上下文。一个函数对象保存了一个对创建它的执行上下文的引用,所以如果你“返回一个函数”,你将返回一个对象,该对象引用了创建的执行上下文 - 而父上下文将只要返回的函数对象处于活动状态,就保持活动状态。您可以将执行上下文视为调用堆栈框架,但将其存储在堆上,因此不会在返回时销毁。 – folkol