Javascript 在没有进一步引用变量后清除变量

标签 javascript performance

据说,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/

相关文章:

javascript - 如何在 chart.js 或 D3 中制作阶梯线或阶梯图?

javascript - 在键入下一个跨度项之前,javascript 创建新行的键入效果

javascript - Safari:打印 Iframe 时防止出现两个打印对话框

javascript - 我无法让我的 jQuery 工作,并且我不确定我做错了什么

regex - 流水线 sed 调用和多个 sed 表达式之间的效率是否存在差异?

performance - Excel VBA : Writing an array to cells is very slow

javascript - $.cookie ('name' ) 不是一个函数?

python - 为什么计算优先附着是昂贵的?

java - Matlab 与 Java

SQL Server Update 仅在其更新时触发并且仅针对列中的特定值