每当我向Firefox提交一个插件时,我会收到一封电子邮件,告诉我我的一些变量正在泄漏到全球范围......一旦他们告诉我我解决了这个问题。但在那之前有没有办法(程序?)来检查变量是否泄漏到全局范围内?
谢谢!
答案 0 :(得分:4)
当您错过var
时,JSLint和JSHint都会向您发出警告。两者都可以在Github上使用(JSLint,JSHint),并且可以使用Node.js,Rhino或您选择的任何其他非浏览器环境从命令行运行。它们甚至可以集成到您选择的文本编辑器/ IDE中,并通过击键运行。
答案 1 :(得分:4)
ECMAScript标准第5版引入了可选的“严格模式”,迫使您使用更清晰的JS子集。在严格模式下,如果尝试分配给尚未使用var关键字声明的变量,则会抛出ReferenceError。
您可以在函数内部或整个文件中启用严格模式,方法是将其作为第一个语句包含在内:
"use strict";
我建议严格模式解决您的问题。它已经在最新版本的主流浏览器中实现。请参阅此处获取概述:
答案 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“。