据说,javascript会在最后一次引用变量后从内存中清除它。
为了这个问题,我创建了一个只有一个变量的 JS 文件用于 DEMO;
//file start
//variable defined
var a=["Hello"]
//refenence to that variable
alert(a[0]);
//
//file end
没有对该变量的进一步引用,所以我希望 javascript 清除变量 'a'
现在我只是运行这个页面,然后打开 Firebug 并运行这段代码
alert(a[0]);
现在这会提醒变量的值,如果语句“Javascript 在没有进一步引用变量后清除变量”为真,那么 alert() 会显示其值。
是不是因为在全局上下文中定义的所有变量都成为窗口对象的属性,并且因为即使在执行文件窗口对象存在之后,它的属性也是如此。
最佳答案
当然,在此示例中必须保留变量 - 毕竟,您保留了已在其中定义的 ENVIRONMENT。只要您仍然可以访问,就必须保留它,所以如果您可以进行此测试并且它永远失败 - JS 解释器是“kaputt”。
改为这样做:
(function () {
var a = 1;
}());
// and NOW, at THIS point there is nothing any more referencing "a"
当然,从“这里”你无法测试它——你必须查看 JS 解释器/编译器的内部内存结构(在今天的 V8 时代,它更像是一个“编译器”或“编译器” “安威)。
此外,与所有垃圾收集 (GC) 语言一样,内存不会立即释放,而是取决于 Javascript 的特定实现所使用的 GC 策略,这也考虑了当前的内存使用情况和需求。 GC 是一项代价高昂的操作,如果可能的话,它会被延迟,和/或在它没有从真实应用程序中夺走 CPU 资源时运行。
顺便说一句,细微的变化:
(function () {
var a = 1;
//empty function assigned to global namespace,
//in browsers "window" is the global object
window.example_function = function () {};
}());
在此示例中,结果与您的相同:只要您查看该页面,“a”的内存就永远不会释放:分配给全局对象的属性 example_function 的函数仍然存在,因此所有环境is 的定义必须保留!仅在
delete window.example_function
从全局对象中删除那个属性——它最终是一个指向(空)函数表达式的指针——可以释放变量“a”。另请注意,该函数甚至没有使用“a”,请参阅 Google 并搜索“词法作用域”,这是 Javascript 语言最具定义性的属性之一。
更有趣的是:
我写了吗
//define a variable in global namespace
var example_function;
(function () {
var a = 1;
//empty function assigned to global namespace,
//in browsers "window" is the global object
example_function = function () {};
}());
我无法使用“删除”来删除它,事实上我永远无法释放它。这是因为在第一个示例中 example_function 成为全局 object 的新属性(强调),而在最后一个示例中它是一个变量,并且“删除”仅适用于对象属性。 (我在前面的示例中使用了“windows.example_function”,但没有“window”。它会是一样的,example_function 将被创建为全局对象中的属性。只有“var”语句创建变量。)
关于Javascript 在没有进一步引用变量后清除变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5169523/