实际上,您的示例有些棘手。这是故意的吗?您似乎使用内部词法作用域的restofprogram()函数的val参数掩盖了外部val变量,而不是实际使用它。但无论如何,您正在询问str,因此为了简单起见,让我忽略您的示例中val的棘手性。
我猜测,即使restofprogram()不使用str,该变量也不会在函数完成之前被收集。如果restofprogram()不使用eval()和new Function(),那么它可能会被安全地收集,但我怀疑不会这样做。这对于V8来说是一个棘手的优化,可能不值得麻烦。如果语言中没有eval和new Function(),那么就会容易得多。
现在,这并不意味着它永远不会被收集,因为单线程事件循环中的任何事件处理程序都应该几乎立即完成。否则,整个进程将被阻塞,您将面临比内存中一个无用的变量更大的问题。
现在,我想知道您是否没有在实际编写示例时表达出您实际想要的东西。Node中的整个程序与浏览器中的程序完全相同-它只是注册异步触发的事件回调函数,这些函数在主程序体已经完成后稍后异步触发。此外,没有任何处理程序会阻塞,因此实际上没有任何函数需要花费任何显着的时间来完成。我不确定我是否理解了您实际上在问题中想要表达的意思,但我希望我所写的内容对于理解它们是如何工作的有所帮助。
更新:
在评论中阅读更多关于您的程序外观的信息之后,我可以说得更多。
如果您的程序类似于:
readfile("blah", function (str) {
var val = getvaluefromstr(str);
Server.start(function (request) {
});
});
那么你也可以这样写:
readfile("blah", function (str) {
var val = getvaluefromstr(str);
Server.start(serverCallback);
});
function serverCallback(request) {
});
在调用Server.start()后,
str
将会超出作用域并最终被回收。此外,这将使您的缩进更加易于管理,在更复杂的程序中不应低估其重要性。
至于
val
,在这种情况下,您可以将其设置为全局变量,这将大大简化您的代码。当然,您也可以使用闭包,但在这种情况下,使
val
成为全局变量或使其存在于适用于readfile回调和serverCallback函数的外部作用域似乎是最简单的解决方案。
请记住,任何您可以使用匿名函数的地方,您也可以使用命名函数,并且对于这些函数,您可以选择它们所在的作用域。