На самом деле ваш пример несколько хитрый.Это было нарочно?Вы, похоже, маскируете внешнюю переменную val
с внутренним лексически ограниченным аргументом restofprogram () val
вместо фактического ее использования.Но в любом случае, вы спрашиваете о str
, поэтому позвольте мне проигнорировать хитрость val
в вашем примере просто для простоты.
Я думаю, что переменная str
не будетполучить до того, как завершится функция restofprogram (), даже если она не использует ее. Если restofprogram () не использует str
и , то не использует eval()
и new Function()
, тогда его можно безопасно собрать, ноЯ сомневаюсь, что это будет.Это была бы сложная оптимизация для V8, вероятно, не стоит проблем.Если бы в языке не было eval
и new Function()
, то это было бы намного проще.
Теперь, это не означает, что он никогда не будет собран, потому что любой обработчик событий в одномПотоковый цикл обработки событий должен завершиться практически мгновенно.В противном случае весь ваш процесс был бы заблокирован, и у вас возникли бы большие проблемы, чем одна бесполезная переменная в памяти.
Теперь мне интересно, не имели ли вы в виду что-то еще, кроме того, что вы написали в своем примере.Вся программа в Node такая же, как в браузере - она просто регистрирует обратные вызовы событий, которые запускаются асинхронно позже после того, как основное тело программы уже завершено.Кроме того, ни один из обработчиков не блокируется, так что ни одна функция не требует заметного времени для завершения.Я не уверен, что понял, что вы на самом деле имели в виду в своем вопросе, но надеюсь, что написанное мной поможет понять, как все это работает.
Обновление:
После прочтениябольше информации в комментариях о том, как выглядит ваша программа, я могу сказать больше.
Если ваша программа выглядит примерно так:
readfile("blah", function (str) {
var val = getvaluefromstr(str);
// do something with val
Server.start(function (request) {
// do something
});
});
Тогда вы также можете написать это так:
readfile("blah", function (str) {
var val = getvaluefromstr(str);
// do something with val
Server.start(serverCallback);
});
function serverCallback(request) {
// do something
});
После того, как Server.start () будет вызван, str
выйдет из области видимости и в конечном итоге будет собран.Кроме того, это сделает ваши отступы более управляемыми, что нельзя недооценивать для более сложных программ.
Что касается val
, вы можете сделать его глобальной переменной в этом случае, что значительно упростит ваш код.Конечно, вам не нужно, вы можете бороться с замыканиями, но в этом случае создание val
глобального или включение его во внешнюю область, общую как для обратного вызова readfile, так и для функции serverCallback, кажется наиболее простым решением.
Помните, что везде, где вы можете использовать анонимную функцию, вы также можете использовать именованную функцию, и с теми, которые вы можете выбрать, в какой области вы хотите, чтобы они жили.