Перемещаются ли переменные аргумента функции из стека, когда аргумент является объектом? - PullRequest
0 голосов
/ 21 мая 2019

Итак, я недавно читал о стеке и куче, и как они управляются во время выполнения, но есть случай, который меня беспокоит, так как у меня есть определенный сценарий использования в моих тестовых пакетах.

Например,

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

}

В приведенном выше коде я создаю ссылку на уже существующий экземпляр объекта, который в моем конкретном случае отвечает за создание перехватчиков http.Я выполняю этот тип функций несколько раз в одном тесте, поскольку я делегирую логику для создания этих перехватчиков другим функциям, а не записываю их построчно в моих наборах, чтобы избежать слишком большого количества шаблонов, повторений и улучшить читаемость.Поэтому мой вопрос - все ли эти ресурсы освобождаются при выходе из каждой функции (возвращает неопределенное значение)?Я спрашиваю об этом, потому что сам объект все еще существует в памяти, и я стал бояться, что использую слишком много ресурсов с таким безрассудным подходом.

1 Ответ

0 голосов
/ 21 мая 2019

Краткий ответ на вопрос: ДА.

Пусть аргументы функции являются ссылками на объекты или примитивными переменными, они сохраняются в стеке только до тех пор, пока функция не будет выполнена.

Одним из основных эффектов вышеуказанного механизма является то, что , когда аргументы являются ссылками на объекты, из стека высовывается только ссылка . Реальный объект, на который вы ссылаетесь, все еще живет в памяти, пока процесс сбора мусора 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

Здесь - статья, с которой вы можете более подробно ознакомиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...