javascript:全局变量泄漏

时间:2011-07-26 17:07:47

标签: javascript global-variables

每当我向Firefox提交一个插件时,我会收到一封电子邮件,告诉我我的一些变量正在泄漏到全球范围......一旦他们告诉我我解决了这个问题。但在那之前有没有办法(程序?)来检查变量是否泄漏到全局范围内?

谢谢!

5 个答案:

答案 0 :(得分:4)

当您错过var时,JSLintJSHint都会向您发出警告。两者都可以在Github上使用(JSLintJSHint),并且可以使用Node.js,Rhino或您选择的任何其他非浏览器环境从命令行运行。它们甚至可以集成到您选择的文本编辑器/ IDE中,并通过击键运行。

答案 1 :(得分:4)

ECMAScript标准第5版引入了可选的“严格模式”,迫使您使用更清晰的JS子集。在严格模式下,如果尝试分配给尚未使用var关键字声明的变量,则会抛出ReferenceError。

您可以在函数内部或整个文件中启用严格模式,方法是将其作为第一个语句包含在内:

"use strict";

我建议严格模式解决您的问题。它已经在最新版本的主流浏览器中实现。请参阅此处获取概述:

https://developer.mozilla.org/en/JavaScript/Strict_mode

答案 2 :(得分:3)

其他人推荐的lint工具是一个很好的主意,并且会指出你的问题,但是如果你有单元测试,你可以将泄漏的全局变量的测试合并到它们中。

在加载源代码之前运行它,

var globalsBeforeLoad = {};
(function () {
  for (var k in this) { globalsBeforeLoad[k] = true; }
})()

然后在加载代码后运行此代码

(function () {
  var leaked = [];
  for (var k in this) {
    if (!Object.hasOwnProperty.call(globalsBeforeLoad, k)) {
      leaked.push(k);
    }
  }
  if (leaked.length) { alert("You leaked " + leaked.join(", ")); }
})()

答案 3 :(得分:2)

函数内部不以var开头的任何变量声明都会泄漏到全局范围内。你可以检查一下。

答案 4 :(得分:1)

在每个函数的顶部声明所有变量。

  

最糟糕的JavaScript功能是它依赖于全局变量。全局变量是   在每个范围内都可见的变量。全局变量在非常小的程序中可以是方便的,但它们   随着程序变大,很快变得笨拙。因为全局变量可以被任何部分改变   程序在任何时候都会使程序的行为大大复杂化。使用全局变量   降低使用它们的程序的可靠性。   [...]   在大多数语言中,通常最好在首次使用的站点声明变量。结果证明是坏事   在JavaScript中练习,因为它没有块范围。最好在顶部声明所有变量   每个功能。

“JavaScript:Douglas Crockford撰写的好文章。版权所有2008 Yahoo! Inc., 978-0-596-51774-8“。