12

JSLintは、「定義される前に「b」が使用された」というこのコードを好みません。

var a = function () {
        b();
    },

    b = function () {
        alert("Hello, world!");
    };

a();   

しかし、これには完全に満足しています

var a, b;

a = function () {
    b();
};

b = function () {
    alert("Hello, world!");
};

a();   

しかし、2番目のコードスニペットでは何も定義していません。私は単に変数bを宣言しているだけです。

では、なぜJSLintがこれを行っているのでしょうか。最初にすべての関数を宣言する必要がある理由はありますか?

PS aとbの順序を変更することもできたと思いますが、実際のプロジェクトでは、私の関数はイベントハンドラーであり、相互に呼び出すこともあるため、おそらく不可能です。

4

3 に答える 3

12

コードが適切に記述され、オブジェクト指向である場合、使用する前に関数を宣言することができます。しかし、JSLintは、アプリケーションの機能とはほとんど関係のない多くの標準を設定しており、関数を何らかの方法で宣言することでパフォーマンスに影響があるとは思えません。

于 2012-10-18T20:32:12.983 に答える
11

では、なぜJSLintがこれを行っているのでしょうか。最初にすべての関数を宣言する必要がある理由はありますか?

はい。そうしないと、予期しないエラーが発生する可能性があります。JavaScriptの「巻き上げ」により、コードは機能します。このメカニズムは、暗黙的または明示的なすべての宣言をプルアップし、予期しない結果を引き起こす可能性があります。

このコードを考えてみましょう:

var s = "hello";    // global variable
function foo() {
    document.write(s);   // writes "undefined" - not "hello"
    var s = "test";      // initialize 's'
    document.write(s);   // writes "test"
};
foo();

それは次のように解釈されています:

var s = "hello";    // global variable
function foo() {
    var s;               // Hoisting of s, the globally defined s gets hidden
    document.write(s);   // writes "undefined" - now you see why
    s = "test";          // assignment
    document.write(s);   // writes "test"
}
foo();

(ドイツ語版ウィキペディアのページからの例:http://de.wikipedia.org/wiki/Hoisting

于 2013-07-11T20:56:45.850 に答える
3

Cでは、これは前方宣言と呼ばれるものであり、JSLintでも同じである可能性があります。JSLintはbを認識しており、その時点でbはすべての関数である可能性があります(ただし、関数でない場合は、もちろんエラーがスローされます)

于 2012-10-18T20:29:11.500 に答える