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定義される前に使用されていると文句を言います。ただし、 afterが宣言さfooれるまで呼び出されません。barコードは、私が試したすべてのブラウザーで正常に動作します: http://jsfiddle.net/jDKvz/

パターンは、JavaScript で名前空間を宣言するにはどうすればよいですか?ごとです。、2番目の答え。

ここで何かを修正する必要がありますか、それとも 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

bar関数宣言ではなく関数式です。つまり、割り当てられた後にのみ機能します。代わりに関数宣言を使用することができ、jslint はもう文句を言いません。

function bar() {
    ...
}

また、new Function不要でfunction十分です。

編集:

newこの場合、自動呼び出し関数(function(){}())またはオブジェクトリテラルの使用を取り除くようです{}

于 2012-05-10T06:42:05.270 に答える
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 に答える