Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将变量设置为';未定义';实际上是释放空间?_Javascript_Node.js - Fatal编程技术网

Javascript 将变量设置为';未定义';实际上是释放空间?

Javascript 将变量设置为';未定义';实际上是释放空间?,javascript,node.js,Javascript,Node.js,我正在寻找一种明确的方法来确保JavaScript垃圾收集器很快就能完成它的工作 那么,将变量设置为未定义就是一种保证吗 var foo = "something"; // do stuff with foo foo = undefined; // awake the Garbage Collector interest to him 理论上说,不,它不会被加奇收集。内存中仍有对该变量的引用。它包含未定义的值这一事实与此无关 想象一下RAM就像一个巨大的盒子仓库。这些箱子由不同的公司(UPS

我正在寻找一种明确的方法来确保JavaScript垃圾收集器很快就能完成它的工作

那么,将变量设置为
未定义
就是一种保证吗

var foo = "something";
// do stuff with foo

foo = undefined;
// awake the Garbage Collector interest to him

理论上说,不,它不会被加奇收集。内存中仍有对该变量的引用。它包含未定义的值这一事实与此无关

想象一下RAM就像一个巨大的盒子仓库。这些箱子由不同的公司(UPS、联邦快递等)共享。每个盒子都有一个地址,每个公司都会告诉一些中央应用程序“嘿,这个地址的盒子正在被我使用”。因此,即使您清空或取消定义该框,UPS和该框之间仍然存在1:1的连接。同样,JS解释器告诉操作系统(“嘿,我正在使用xxx的内存位置,不要把它分配给其他任何人”)

它包含未定义的值这一事实不会释放此内存位置。您的操作系统不知道也不关心内存位置中的内容,他知道它被分配给您的JS解释器,并且您的JS解释器将它链接到您的变量foo


无论如何,您不应该为JS中的垃圾收集而烦恼。只要您在正确的位置创建变量,并且不会淹没全局对象(但即使如此,我怀疑您会遇到很多问题)每一个变量一旦不能使用就会被自动垃圾收集。

请记住,即使变量被设置为未定义,它仍在内存中,并且会占用空间。GC收集该变量的最佳方法是使其超出范围。因此,最好的做法仍然是在函数或块,并将
持久性
变量放入全局范围?@FopaLéonConstantin
持久性变量放入全局范围
一般来说,您根本不需要使用全局范围。好的,我知道了,变量仍然存在,但是空间是自由的?因为
未定义的
不会占用那么多空间?rigth?最佳实践总是在尽可能狭窄的范围内声明变量。这样你的JS引擎就知道什么时候垃圾收集它们了。@FopaLéonConstantin,你不知道也无法控制内存中未定义的空间有多少,你的解释器会帮你处理这些,并且做得非常出色。不,空间不是免费的。如果您有一个对内存位置的引用,那么不管内存中有什么,都会使用该空间。把记忆想象成房子。市议会在某条街上给你分配了一所房子。不管你现在是否在家,这个空间已经分配好了。