javascript:全局变量泄漏
每当我向Firefox提交插件时,我都会收到一封电子邮件,告诉我我的一些变量正在泄漏到全局范围。。。一旦他们告诉我我解决了问题。但在那之前,有没有办法(程序?)检查变量是否泄漏到全局范围javascript:全局变量泄漏,javascript,global-variables,Javascript,Global Variables,每当我向Firefox提交插件时,我都会收到一封电子邮件,告诉我我的一些变量正在泄漏到全局范围。。。一旦他们告诉我我解决了问题。但在那之前,有没有办法(程序?)检查变量是否泄漏到全局范围 谢谢 两者都有,当您错过var时,将向您发出警告。两者都可以在Github(,)上使用,并且都可以使用Node.js、Rhino或您选择的任何其他非浏览器环境从命令行运行。它们甚至可以集成到您选择的文本编辑器/IDE中,并通过按键运行。函数中任何不以var开头的变量声明都将泄漏到全局范围。您可以检查这些工具。其
谢谢 两者都有,当您错过
var
时,将向您发出警告。两者都可以在Github(,)上使用,并且都可以使用Node.js、Rhino或您选择的任何其他非浏览器环境从命令行运行。它们甚至可以集成到您选择的文本编辑器/IDE中,并通过按键运行。函数中任何不以var
开头的变量声明都将泄漏到全局范围。您可以检查这些工具。其他人推荐的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(", ")); }
})()
ECMAScript标准第5版引入了可选的“严格模式”,这迫使您使用更干净的JS子集。在严格模式下,如果您试图分配给未使用var关键字声明的变量,则会抛出ReferenceError 您可以在函数内部或整个文件中启用严格模式,方法是将此作为第一条语句:
"use strict";
对于你的问题,我推荐严格模式。它已经在主要浏览器的最新版本中实现。有关概述,请参见此处:
在每个函数的顶部声明所有变量 JavaScript最糟糕的特性是它对全局变量的依赖。全局变量是一个 在每个范围中都可见的变量。在非常小的程序中,全局变量可能是一种方便,但它们 随着程序越来越大,很快就会变得笨拙。因为全局变量可以由 在任何时候,它们都会显著地使程序的行为复杂化。全局变量的使用 降低了使用它们的程序的可靠性。 [...] 在大多数语言中,通常最好在首次使用的位置声明变量。结果证明这是一个坏消息 在JavaScript中练习,因为它没有块作用域。最好在列表顶部声明所有变量 每个功能 “JavaScript:Douglas Crockford的好部分。版权所有2008 Yahoo!Inc。,
978-0-596-51774-8.“是的,这就是我所想的。。。虽然检查这些东西的工具很棒,但不难避免JS中有任何全局变量。不同的是,这里我需要一个工具。。。在那里,我不知道发生了什么……我没有注意到你是同一个人:)