2012-05-10 15 views
3

をJSLint「が定義されています前に、機能を使用した」原因:名前空間パターンは、私は、次の名前空間パターンを使用していますエラー

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が宣言されるまで呼び出されません。コードは私が試したすべてのブラウザで正常に動作します:http://jsfiddle.net/jDKvz/

パターンはHow do I declare a namespace in JavaScript?、2番目の答えです。

ここで何かを修正する必要がありますか、それともJSLintを無視するだけですか?

+0

おそらく、2つの関数の順序を逆にすると、JSLintは幸せになるでしょうが、それを行う必要があるかどうかは主観的です。私はすべてについてJSLintに同意しませんが、この場合はおそらくコードを変更してシャットダウンします。 – nnnnnn

+0

@nnnnnn私の実際のプロジェクトははるかに複雑で、おそらく互いに呼び出す関数を含んでいます。 – Flash

+0

その場合、私はこの時点でJSLintを無視しても大丈夫です。 'var foo = function()...'ではなく 'function foo()...'構文を使ってみると、相違が生じているかどうかを知ることができます。実際に気に... – nnnnnn

答えて

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をオンにすることも役に立ちます。

0

編集:思考JSは変数ではなく値を閉じました。

JSLintは変数ホイストが発生していないために不平を言っています。他の関数が使用する関数の前に他の関数が使用する関数を定義するだけです。コードを読みやすくし、JSLintをシャットダウンします。例えば

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

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

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

私のコードも動作します。問題のフィドルを見てください。 – Flash

+0

「閉鎖のルール」?もう一度考えて。 _ "は値undefinedで閉じられています..." _ _ closureは_values_でなく_variables_を閉じます。 'bar'は' foo() 'が呼び出されるときに定義されるので、問題に示されているコードが動作します。関数を逆にするとJSLintがシャットダウンするはずですが、元の方法は実際には間違っているわけではありません。 – nnnnnn

+0

申し訳ありませんが、誤ったクロージャのものよりも可読性が高くなるように変更されました。私は誰かに関数ステートメントを使うように言うつもりはありません。 – Havvy

0

barは、それが割り当てられていた後、それだけでうまくいくことを意味し、関数式ではなく、関数の宣言です。代わりに関数宣言を使用することができ、jslintはこれ以上不平を言わないでしょう。

function bar() { 
    ... 
} 

はまた、new Functionfunctionが十分で、不要です。

編集:

newを取り除くために、この場合のように思えるの自動呼び出し機能(function(){}())やオブジェクトを使用するリテラル{}

+0

'new' *はここに必要です – KooiInc

+0

なぜ、目的は何ですか? – elclanrs

+1

以下の関数をコンストラクタとして呼び出します。 – Havvy

関連する問題