避免在JavaScript中使用暗示全局变量(JSlint)

5
当编写像这样的代码时,jsLint会抱怨隐式全局变量:
var Test = (function(){
    var fnc = function(x){
        alert("pew: "+x);
    };

    return {
        fnc: fnc
    };
}());

Test.fnc("hat");

(具体来说,是“隐含全局变量:alert 4”)

如何避免这种情况被认为是正确的方法?我的直觉反应是这样的,但我并不确定它是否“正确”:

var Test2 = (function(global){
    var alert = global.alert;

    var fnc = function(x){
        alert("pew: "+x);
    };

    return {
        fnc: fnc
    };
}(this));

Test2.fnc("hat");

编辑: 似乎大家的共识是问题不在于我访问了全局变量,而是我没有告诉jslint哪些是全局变量。我会再等待一段时间看看是否还有其他意见,然后选择一个答案。

4个回答

8

你可以在文件前添加注释

/*global alert $ document window*/

这通常是我告诉JSLint特定变量不是内部变量而是外部变量的方法。

这么做既不会影响代码,又能让其他程序员知道你声明了这些变量为外部变量,对于大型多文件程序非常有用。


2
如果我没记错的话,变量名声明需要用逗号分隔吧? - Zack The Human
@ZackTheHuman,这里是空格分隔的。结果JSLint说应该用逗号分隔。我一直使用空格分隔的列表而没有出错。它可能同时处理两种方式。 - Raynos
请注意,在注释的开头和“global”之间不应有空格,否则jslint将无法处理它。 - oyenamit

4
使用jsLint的“假设为浏览器”和“假设为控制台、警告”的选项,使这些函数在jsLint中得到确认。 请参考http://www.jslint.com/lint.html#options获取所有可用选项的列表。

1

对于那些寻找JSHint的人,有一个选项“browser”,可以将其设置为“true”,并处理所有常见全局变量。对于“jquery”也是如此。我从gradle-js-plugin源代码中学到了这一点。


0

我认为你的方法是正确的(而且也很好),但没有必要声明 global.alert,只需使用 global.alert("pew: "+x);


var alert = global.alert 这只是为了方便,所以它的行为与我留下错误时的行为相同。 - david
我不认为使用它会有任何便利性。但是除了这一点以外,我认为你的解决方案不仅正确,而且很好。 - Dr.Molle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接