【问题标题】:Avoiding Implied globals in javascript (JSlint)避免在 javascript (JSlint) 中使用隐含的全局变量
【发布时间】:2011-01-31 23:07:20
【问题描述】:

当编写这样的代码时,jsLint 抱怨隐含的全局变量:

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

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

Test.fnc("hat");

(具体来说,“隐含全局:警报 4”)

什么被认为是避免这种情况的正确方法?我的本能反应是这样的,但我不相信它是“正确的”:

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

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

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

Test2.fnc("hat");

编辑: 共识似乎是问题不在于我正在访问全局变量,而更多的是我没有告诉 jslint 全局变量是什么。我将把这个打开一段时间,看看有没有其他人有意见,然后我会选择一个答案。

【问题讨论】:

    标签: javascript jslint


    【解决方案1】:

    您可以在文件前添加评论

    /*global alert $ document window*/

    这通常是我告诉 JSLint 它不是隐含的而是外部的。

    这既不显眼,也告诉您的程序员同事您将这些变量声明为外部变量,这对于较大的多文件程序很有用。

    【讨论】:

    • IIRC 变量名声明不需要逗号分隔吗?
    • @ZackTheHuman 有空格分隔。原来 JSLint 说有逗号分隔。我一直使用空格分隔的列表,没有错误。它可能同时处理这两个
    • 注意注释开头和global之间不能有空格,否则jslint不会处理。
    【解决方案2】:

    使用 jsLint 的“假设浏览器”和“假设控制台,警报,...”选项让 jsLint 知道这些功能。 有关所有可用选项的列表,请参阅 http://www.jslint.com/lint.html#options

    【讨论】:

      【解决方案3】:

      对于那些搜索 JSHint 的人,有一个选项“browser”可以设置为“true”并处理所有常见的全局变量。与“jquery”相同。这是我从gradle-js-plugin source code 那里学到的。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • var alert = global.alert 真的只是为了方便,所以它的行为与我刚刚留下错误时的行为相同。
        • 我认为使用它没有任何便利。但不管这部分,我认为你的解决方案不仅正确,而且很好。
        猜你喜欢
        • 2010-12-22
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 2011-06-05
        • 2020-09-02
        相关资源
        最近更新 更多