命名空间模式导致JSLint'函数在被定义之前被使用'错误

时间:2012-05-10 06:31:46

标签: javascript namespaces jslint javascript-namespaces

我使用以下命名空间模式:

var MyNamespace = new function () {
    var foo = function () {
        bar();
    };
    var bar = function () {
        alert("bar");
    };
    this.init = function () {
        foo();
    };
};

$(document).ready(function() {
    MyNamespace.init();
});

JSLint抱怨在bar定义之前使用foo。但是,在bar声明之后才会调用{{1}}。该代码适用于我尝试过的所有浏览器:http://jsfiddle.net/jDKvz/

模式是How do I declare a namespace in JavaScript?,第二个答案。

我需要在这里修改一些东西,还是应该忽略JSLint?

3 个答案:

答案 0 :(得分:1)

我怀疑是因为提升,变量和函数声明被解释器提升到最顶层,这很可能就是它的看法:

var MyNamespace = new function () {
    var foo;
    var bar;

    foo = function () {
        bar();
    };

    bar = function () {
        alert("bar");
    };

    this.init = function () {
        foo();
    };
};

现在foo = function () {bar();};内部尚未解析bar(),它只是一个变量bar,而不是此时要调用的函数。

话虽如此,如果您的代码运行正常,您可以使用它,转动strict mode也很有帮助。

答案 1 :(得分:0)

编辑:思想JS关闭了值,而不是变量。

JSLint抱怨,因为它没有看到变量挂起。只需在使用它们的函数之前定义其他函数使用的函数。它有助于使代码更具可读性,并关闭JSLint。

例如:

var MyNamespace = new function () {
    var bar = function () {
        alert("bar");
    };

    var foo = function () {
        bar();
    };

    this.init = function () {
        foo();
    };
};

答案 2 :(得分:0)

bar是一个函数表达式而不是函数声明,这意味着它只能在被赋值之后才能工作。您可以使用函数声明,jslint不会再抱怨了。

function bar() {
    ...
}

此外,new Function是不必要的,function就足够了。

修改

似乎在这种情况下摆脱new使用自动调用函数(function(){}())或对象文字{}