3

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

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,直到 afterbar被声明后才被调用。该代码适用于我尝试过的所有浏览器:http: //jsfiddle.net/jDKvz/

该模式是按照如何在 JavaScript 中声明命名空间?,第二个答案。

我需要在这里修复什么,还是应该忽略 JSLint?

4

3 回答 3

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也很有帮助。

于 2012-05-10T07:53:59.477 回答
0

编辑:认为 JS 关闭了值,而不是变量。

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

例如:

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

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

    this.init = function () {
        foo();
    };
};
于 2012-05-10T06:38:46.427 回答
0

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

function bar() {
    ...
}

还有,new Function没必要,function就够了。

编辑:

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

于 2012-05-10T06:42:05.270 回答